线程
文章平均质量分 94
yarnecn
这个作者很懒,什么都没留下…
展开
-
从ReentrantLock的实现了解AQS(下)
文章目录锁状态存储StateexclusiveOwnerThread线程队列队列节点队列操作方法hasQueuedPredecessors()acquire(核心)拿锁安排入队睡眠入队二次确认是否进入睡眠发现可以拿锁发现确实没希望确认前辈睡了我也休息了总结 上节在讨论ReentrantLock的过程中,我们遇到了几个在AQS中实现的方法,比如AQS的核心逻辑实现acquire、判断是否有前辈的方法hasQueuedPredecessors、尝试占锁的方法compareAndSetState、拿到锁之后设置锁原创 2021-10-17 02:37:15 · 305 阅读 · 0 评论 -
从ReentrantLock的实现了解AQS(上)
文章目录ReentrantLock内部结构SyncFairSync1. 无等待或优先才给机会尝试2. 递归调用NonfairSync1. 立即尝试2. 再次尝试3. 递归调用NonfairSync vs FairSync ?疑问解答 之前文章很多次提到了AQS,AQS全名是AbstractQueuedSynchronizer,它是java.util.concurrent.locks包下的一个抽象类,和它的包名一样,AQS主要的作用就是用来实现锁,它跟synchronized的区别是,synchroniz原创 2021-10-16 00:23:37 · 262 阅读 · 0 评论 -
可见性、有序性、原子性如何保证?
文章目录volatile使用理解Lock前缀sychronized使用理解加在方法上锁代码块锁进入以及锁释放Atomic使用CompareAndSweep总结 上篇文章简单介绍了多线程开发会遇到的问题。现在我们知道因为JMM模型导致,线程之间的可见只能通过将线程本地内存的值更新到主内存中,然后更新其他线程里的值保证可见。但是在多线程的情况下,我们如果真的等一个线程结束之后,才能知道某个值的结果,那其实相当于线程之间的变量,就是不可见的。然后因为编译器和处理器为了提升运行效率的重排序,导致虽然单线程的结果没有原创 2021-09-10 00:37:18 · 945 阅读 · 0 评论