线程同步

简介:

线程同步:

线程是独立并行的,许多的线程就像许多的人一样,如果对某样东西进行使用的时候不进行排队,都争抢使用的话就自然容易会导致破坏这样东西。

使用多个线程去对某个值进行操作的时候没有使用同步块或者同步方法,多个线程就会一起操作这个值,数据就会遭到破坏导致结果值是错误的。

代码示例:

c6f4c37c3e553534b6a4144e882a8205.png


运行结果:

68bca0882d4310e7cd04001e1c525e76.png

从代码来看本来运行的结果应该是10000的,得出错误的结果是因为每个线程抢着执行,比如第一个线程执行到3999的时候第二个线程就来执行到2999就会覆盖第一个线程计算的值,第三个线程执行到4564又覆盖了第二个线程计算的值,以此类推。最后就会得到错误的结果值。

 



同步块:

解决上面出现的问题,办法就是令线程同步执行,一个个的去使用资源,能让线程们同步的方法之一就是同步块,同步块参数里的对象必须是唯一的才能起到同步效果,如若不然也是没有同步效果的。

因为这就好比资源是房间,同步块参数里的对象就像是厨房的钥匙,唯一的对象就代表这个钥匙只有一份,所以每个线程都得等上一个线程使用完了把钥匙交给下一个线程,下一个线程才能开启这个房间,上一个线程没有把钥匙交给下一个线程的话,下一个线程是无法进入房间的,这样就起到了每个线程都得排队执行的效果。

  示意图:

e2d36468a8841cf664c797ededeec29f.png

但是如果同步块参数里的对象不是唯一的,是多个的。那么,就代表着这个钥匙有很多份,这样的话多个线程都能拿到开启房间的钥匙。所以就失去了同步的效果,因为每个线程都不需要排队等上一个线程的钥匙了,没有同步效果最后的执行结果值自然也是错误的。所以必须要需要注意这一点。

  示意图:

bda692a2cfa6f4f183f7ffd596b6ffd4.png


有同步效果的代码示例:

78be2ae6f5220e1d8b3b13c6b744c946.png


运行结果:

3a508f68f4271743e210b99f75def754.png


无同步效果的代码示例:

0eb135a9cac3d77d77fd0488457160a1.png


运行结果:

b15819f81a96f6ad392b4b05c08ec903.png

同步块一般是在在编写代码的过程中刚好某一处需要同步效果的时候才写的,如果编写代码的时候提前知道需要同步效果的话,是使用同步方法的。



同步方法:

同步方法就是在方法上加上synchronized同步关键字,要记得的是加上静态关键字,因为不写静态的话线程会同时调用这个这方法,同时调用同一个方法也会失去同步效果。

代码示例:

6e1d2972972870aaccbedb4bc7979c4e.png

64403f15739e95b5b98297b7b557080b.png


运行结果:

a3ddf51b8852466d88b05accaa8528c5.png





线程死锁:

线程死锁就是两个线程的同步方法交叉访问就会形成死锁,就是两个线程互相死等对方执行完。

示意图:

23f570a57509ea6c49b1345bd4811611.png


代码示例:

74c63b38335d9a1a6fed8d922ff91a83.png

05d6ff47b3e355cf192def78fde4fde4.png




一般出现死锁的情况很少,而且在jdk的飞行器里也可以检测出死锁,所以只是需要了解这一情况的发生原理即可。

使用飞行器检测线程死锁:

首先打开飞行器进入到当前的工程中:

a334706bd94ba83911ae6ba0c0568500.png



然后进入线程选项:6236924ac61d1131a9e3680372f343ea.png


将死锁检测打上勾:

540092927c4042ac9a3497db5352b408.png


然后就可以查看死锁哪一列是否存在死锁了:

8eb03a424cb2ae99656212572626b49e.png




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/1976649,如需转载请自行联系原作者

相关文章
|
JavaScript 算法 安全
出现错误,无法启动 Visual Studio Exit Code:9
出现错误,无法启动 Visual Studio Exit Code:9
354 2
出现错误,无法启动 Visual Studio Exit Code:9
|
安全
WEB安全~X-Frame-Options
`X-Frame-Options` HTTP响应头用于控制网页是否能在框架中被嵌套,防范点击劫持攻击,保护用户安全。常见取值有`DENY`(禁止嵌套)和`SAMEORIGIN`(同源嵌套)。通过设置此头部,网站能提升安全性,防止被恶意嵌入其他站点。注意合理配置并与其他安全头部结合使用。例如,配置为`ALLOW_FROM baidu.com`允许来自百度的嵌套,`SAMEORIGIN`则仅允许同域名嵌套,而`DENY`则拒绝所有。不配置则无保护。
479 2
|
测试技术 网络架构 UED
转发路由器Transit Router评测报告
本评测报告对转发路由器Transit Router(TR)进行了全面评估,通过实际测试数据,对其在跨地域、跨VPC的网络互通场景中的性能和易用性进行了深入分析。评测结果显示,TR在功能、性能和易用性方面均表现优异,ping延时低且稳定,数据传输速度快。综上所述,TR是一款可靠的企业级核心转发网元,适用于构建灵活、大规模的企业级互联网络。
996 4
|
前端开发 NoSQL Cloud Native
|
设计模式 数据采集 机器学习/深度学习
Python 学习路线(2022) (二)
Python 学习路线(2022) (二)
299 0
Python 学习路线(2022) (二)
|
存储 人工智能 分布式计算
大数据的时代转型 需要何种理念与布局?
大数据的时代转型 需要何种理念与布局?
大数据的时代转型 需要何种理念与布局?
|
运维 Kubernetes Cloud Native
OAM 深入解读:使用 OAM 定义与管理 Kubernetes 内置 Workload
很多读者可能会有疑问:对于 Kubernetes 内置的工作负载 OAM 是否还能直接支持呢?答案当然是肯定的,而且这是 OAM 作为 Kubernetes 原生的应用定义模型的默认能力。下面,本文就以 Deployment 为例,介绍如何使用 OAM 基于 Kubernetes 的内置工作负载来定义和管理云原生应用。
OAM 深入解读:使用 OAM 定义与管理 Kubernetes 内置 Workload
|
定位技术
实操案例!手把手教你画城市轮播地图
大家好,我是阿辰,今天教大家画城市轮播地图,个人觉得这类型的地图可以在很多方面有实际应用,所以就介绍给大家,并给出个实际操作案例! 本文数据来源于之前的【全国火锅店数量分布】,不过不用担心,文中会给出用到的数据
378 0