java中的并发编程

1、上下文切换

即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现 这个机制。这个时间片特别短,一般是几十毫秒,所以会让我们觉得好多任务同时进行。 CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个 任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这 个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。,例如:

当我们在读一本英文的技术书时,发现某个单词不认识,于是 便打开中英文字典,但是在放下英文技术书之前,大脑必须先记住这本书读到了多少页的第 多少行,等查完单词之后,能够继续读这本书

2、多线程一定快吗

我们用一段代码来查看多线程并发是否就一定比串行快

public class ConcurrencyTest {private static final long count = 1000000L;public static void main(String[] args) throws Exception{concurrentcy();;  //并发执行程序serial();       //串行方法}private static void concurrentcy() throws Exception {long start = System.currentTimeMillis();  //获取当前系统时间Thread thread = new Thread(() -> {int a = 0;for (long i = 0; i < count; i++) {a += 5;}});thread.start();int b = 0;for (long i = 0; i < count; i++) {b--;}long time = System.currentTimeMillis() - start;thread.join();System.out.println(String.format("concurrecy: %dms, b=%d", time, b));}private static void serial() {long start = System.currentTimeMillis();int a = 0;for (long i = 0; i < count; i++) {a += 5;}int b = 0;for (long i = 0; i < count; i++) {b --;}long time = System.currentTimeMillis() - start;System.out.println(String.format("serial: %dms, b=%d", time, b));}
}

在我们对count值更改多次后,得出结论如下:

显然,当任务次数在低于1百万时,串行的效率是比并发要高的,这是什么原因呢?因为并发线程有创建和上下文切换的开 销。

减少上下文切换的方法:

3、死锁DeadLock

死锁是指多个进程在运行过程中因争夺资源而造成的一种僵局,若无外力帮助,则它们都无法继续向前推进,直到程序崩溃为止。我们举一个例子:

  public class DeadLockTest {public static Object A = new Object();public static Object B = new Object();public static void main(String[] args) {new Thread(()->{synchronized (A){System.out.println(Thread.currentThread().getName()+"获取了资源A的锁");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (B){System.out.println(Thread.currentThread().getName()+"获取了资源B的锁");}}}).start();new Thread(()->{synchronized (B){System.out.println(Thread.currentThread().getName()+"获取了资源A的锁");try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}synchronized (A){System.out.println(Thread.currentThread().getName()+"获取了资源B的锁");}}}).start();}}```- 该类中,两个线程会发生死锁,因为程序启动时,两个线程几乎同时对A与B上锁,然后又几乎同时开始申请B与A资源,此时便发生了死锁,此时想要解决的话只能从外部强行把发生死锁的进程进行终止,windows的方法如下

首先,使用jps查看java所运行的线程信息,如下

我么可以看到共有4个,然后使用jstack查看线程信息

  • 可以发现,Thread-0与Thread-1是处于locked状态,也就是发生了死锁,此时再执行taskkill /F /PID来将死锁的线程强行终止

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/689545.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java----数组的定义和使用

1.数组的定义 在Java中&#xff0c;数组是一种相同数据类型的集合。数组在内存中是一段连续的空间。 2.数组的创建和初始化 2.1数组的创建 在Java中&#xff0c;数组创建的形式与C语言又所不同。 Java中数组创建的形式 T[] 数组名 new T[N]; 1.T表示数组存放的数据类型…

【姿态解算与滤波算法】

姿态解算 一、主线 姿态表示方式&#xff1a;矩阵表示&#xff0c;轴角表示&#xff0c;欧拉角表示&#xff0c;四元数表示。 惯性测量单元IMU&#xff08;Inertial Measurement Unit&#xff09;&#xff1a;MPU6050芯片&#xff0c;包含陀螺仪和加速度计&#xff0c;分别测…

2.前端路由的配置和使用

一&#xff0c;路由的作用 路由的作用就是将页面文件跟URL地址形成对应匹配 二&#xff0c;如何安装路由 这里我们采用pnpm的方式在项目中执行 pnpm install vue-routernext --save三&#xff0c;路由如何使用 首先创建一个我们需要访问的页面文件&#xff0c;这里我先创建…

HTTP超时时间设置

在进行超时时间设置之前我们需要了解一次http请求经历的过程 浏览器进行DNS域名解析&#xff0c;得到对应的IP地址根据这个IP&#xff0c;找到对应的服务器建立连接&#xff08;三次握手&#xff09;建立TCP连接后发起HTTP请求&#xff08;一个完整的http请求报文&#xff09;服…

安卓apk 脚本判断32位和64位兼容,还是纯64位

安卓工程 打包 32位和64位说明 ndk {// abiFilters armeabi,arm64-v8a 32位和64位// abiFilters arm64-v8a 纯64位} 常用类型说明 armeabi-v7a 第7代及以上的ARM处理器&#xff08;ARM32位&#xff09;&#xff0c;市面上大多数手机使用此CPU类型。 arm64-v8a 第8代、64位A…

探讨 vs2019 c++ 里函数指针与函数类型在使用上的语法区别

&#xff08;1&#xff09;咱们可以用 decltype &#xff08;&#xff09; 来判断函数的类型。但以这个类型定义有用的可指向已存在函数的变量&#xff0c;却行不通。测试如下&#xff1a; 如果把上面的注释去掉会报错&#xff1a; 所以函数类型只有语法意义。但在使用上没有函…

初识java--javaSE(3)--方法,递归,数组,

文章目录 一 方法的使用1.1 什么是方法&#xff1f;main方法注意事项 1.2 方法的调用嵌套调用在方法调用时形参与实参的关系&#xff1a; 1.3 方法的重载方法重载的意义&#xff1f;总结方法重载&#xff1a;方法签名&#xff1a; 二 递归什么是递归&#xff1f;递归的精髓&…

任务:单域,域树的搭建

一、单域&#xff1a; 搭建所需的系统&#xff1a;win2016 sever&#xff0c;win10 1.在创建域前&#xff0c;先设置静态ip 先查看win2016 sever的IP&#xff0c; ip&#xff1a;192.168.154.133 网关&#xff1a;192.168.154.2 DNS服务器&#xff1a;192.168.154.2 设置…

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态 带你入门嵌入式有二十多年开发经验的老技骨做技术支持整个开发包硬件包括电机2205&#xff0c;支持12V到24V宽输入&#xff0c;配套12V2A电源。包装原理图和PCB嵌入式软件嵌入式基础课程 带你入门嵌入式 电机FO…

人生是旷野,不是轨道

最近看到一句话&#xff0c;很喜欢&#xff0c;分享一下。"人生是旷野&#xff0c;不是轨道"。人生不是固定的方程式&#xff0c;也没有唯一答案&#xff0c;没有谁生来就应该是什么样。别太被太多世俗观念束缚住手脚&#xff0c;每个人都有权利自由生长&#xff0c;…

X9C103SIZT1 数字电位计 IC 10K SOIC-8 参数 应用案例

X9C103SIZT1 是一款数字电位器&#xff0c;属于 X9C103 系列。它是一款100抽头的非易失性数字电位器&#xff0c;阻值为 10 kOhm&#xff0c;封装形式为 SOIC-8。这款器件常用于需要调整电子设备阻值的应用中&#xff0c;如音频设备、电源管理以及传感器校准等。 X9C103SIZT1 的…

2024数维杯数学建模B题生物质和煤共热解问题的研究原创论文分享

大家好&#xff0c;从昨天肝到现在&#xff0c;终于完成了2024数维杯数学建模挑战赛B题的完整论文啦。 实在精力有限&#xff0c;具体的讲解大家可以去讲解视频&#xff1a; 2024数维杯数学建模B题煤共热解每一问高质量完整代码讲解&#xff01;_哔哩哔哩_bilibili 2024数维杯…