这篇文章主要讲解了“如何理解ReentrantLock非公平锁源码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解ReentrantLock非公平锁源码”吧!1.锁java中,加锁的方式synchronized,这个是 java 底层实现的,也就是 C 语言实现的。. lock,这个是 java.util.concurrent 包下面的,是 java语言实现的。2.ReentrantLockReentrantLock 是 Lock 的一种实现,是一种可重入的公平或非公平锁。默认是非公平锁。2.1 Lock的创建首先看下锁的创建和使用代码:然后看下创建的是 ReentrantLock 的构造函数:NonfairSync 就是非公平锁。所以 ReentrantLock 默认是非公平锁的实现2.2 lock()加锁的逻辑就比较复杂了,因为存在线程竞争。所以有两种情况,一种是竞争到锁的处理,一种是没有竞争到锁的处理。首先我们还是来看下 lock() 方法,因为最终是非公平的实现,所以免费云主机、域名直接看 NonfairSync 里面的 lock 方法。2.3 没有获取到锁的逻辑 acquire()直接上代码:还是3个方法,阿粉一个一个的说。tryAcquire(arg) ,还是先看代码在分析。a. 获取 state ,如果等于0,说明之前获得锁的线程已经释放了,那么这个线程就会再次去竞争锁,这就是非公平锁的体现,如果是公平锁,是没有这个判断的。b. 如果前一个获得锁的线程没有释放锁,那么就判断是否是同一个线程,是的话就会将 state 加 1。这个就是重入锁的体现。c. 如果都不满足,那么返回 false。acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) ,再次获取锁没有成功,并且又不是可重入锁,那么就存入一个阻塞队列里面。里面还有一点逻辑,就不展开了,有兴趣可以自己看下。selfInterrupt(); 这个是当前线程的中断标志,作用就是在线程在阻塞的是否,客户端通过调用了中断线程的方法 interrupt(),那么该线程被唤醒的时候,就会有响应的处理。具体要看这个线程 run 方法里面的代码逻辑。2.4 unlock()state – 1,如果大于0,说明释放的是重入锁,只需要修改 state 就行了如果等于0,说明要释放锁,释放锁首先需要把独占线程设置为null,再把state设置为0。感谢各位的阅读,以上就是“如何理解ReentrantLock非公平锁源码”的内容了,经过本文的学习后,相信大家对如何理解ReentrantLock非公平锁源码这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是云技术,小编将为大家推送更多相关知识点的文章,欢迎关注!
小编给大家分享一下Python如何删除一个list中的重复元素,相信大部分人都还不怎么了解,因此分享这篇免费云主机、域名文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!答使用 set 函数,set(list)使用字典函数,以上…