Python 官方文档:入门教程 => 点击学习
目录一、线程互斥与同步二、synchronized三、轻量锁与偏向锁一、线程互斥与同步 互斥:指的是多个线程不能同时访问共享变量 同步:指的是多个线程按指定的顺序执行操作 在同时有多
互斥:指的是多个线程不能同时访问共享变量
同步:指的是多个线程按指定的顺序执行操作
在同时有多个线程运行过程中,如何达到互斥和同步呢?
在此使用黑马笔记中room例子来说明锁。(ps: 以前就了解锁,但总会记乱,发现使用形象化记忆后就很清楚)
解决互斥
解决同步
(这涉及到为什么wait(),notify()方法需要用锁,就是因为只有用了锁才能完成同步,那么怎么完成的呢?)
那么room这个数据结构其实就是synchronized的核心了,接下来总结synchronized原理的时候会一直用room的例子
很多人对synchronized原理的理解也就停留在知道字节码有个monitor关键字来管理锁,再浅一点的只知道怎么用,再者懂得深一点的却记不住。我之前就是想深入了解一下但觉得苦涩,就看不下去了,看了黑马的笔记我觉得这玩意儿其实很简单,所以好的老师还是比较重要的。那么在此我也记录一下怎么更好的去理解synchronized的底层原理
从字节码我们可以知道synchronized的底层就是关联了一个monitor,那么这玩意儿是个什么东西,怎么实现锁的功能呢?
首先,可以把monitor的数据结构简化成上图的room,具体点描述如下图
以上就是synchronized的原理。有人就会问了,你说的这些文字我都懂啊,搞个图摆在这也没啥用。
接下来我将从上图直接回答下面的常见的问题
wait()和notify()为什么都得在synchronized后使用?
wait()会释放锁吗?
notifyALL()为什么不会唤醒其他锁对象的线程?
说说synchronized的原理?
线程什么时候从runnable变成waiting,什么时候变成block?
注意了,这里涉及monitor的原理都是synchronized最根本的原理,也称重量级锁,可以看到monitor会频繁切换线程状态,效率比较低。后来synchronized改进了,在使用monitor前还有好几种方案,分别为偏向锁,轻量锁,以及自旋优化。这部分也是面试常考点,也容易记乱,但用图例去记就很清楚。
那么接下来就说说synchronized的改进
轻量锁与偏向锁的核心都是先不让线程冲突的时候直接去找monitor,而是先用锁对象的对象头字段来解决冲突
(写博客好累啊。。。算了我就总结一些自己觉得关键的地方吧)
轻量锁
偏向锁
到此这篇关于总结java多线程之互斥与同步解决方案的文章就介绍到这了,更多相关java多线程之互斥与同步内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
--结束END--
本文标题: 总结java多线程之互斥与同步解决方案
本文链接: https://lsjlt.com/news/125841.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0