一、锁的实现原理:
JAVA concurrent包下面的锁是通过AbstractQueuedSynchronizer内的Node类下面的state属性来实现的,并且锁的可重入属性也是通过state实现的。

先来看看这个state的定义:

   /**
* The synchronization state.
*/
private volatile int state;

同步的状态,是一个volatile修饰的私有整形变量,volatile修饰的变量是一个多线程可见的,但是多线程可见,并不能保证操作是原子的。在AbstractQueuedSynchronizer下的compareAndSetState方法保证了操作的原子性,volatile 和 CAS的结合是并发抢占的关键。

 /**
* Atomically sets synchronization state to the given updated
* value if the current state value equals the expected value.
* This operation has memory semantics of a {@code volatile} read
* and write.
*
* @param expect the expected value
* @param update the new value
* @return {@code true} if successful. False return indicates that the actual
* value was not equal to the expected value.
*/
protected final boolean compareAndSetState(int expect, int update) {
// See below for intrinsics setup to support this
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}

二、可重入锁中的几个概念

查看源码可以看出来,在ReentrantLock内部有一个抽象类sync继承了AbstractQueuedSynchronizer,并且有两个实现,分别是:FairSync,其实就是竞争锁的机制是公平的,公平体现在按照请求的顺序把锁在队列中的线程节点中传递下去,NonfairSync:谁先抢占了state,谁就获得锁,并且一旦加入到队列中就要按照顺序来拿锁。

FairSync:锁的访问会按照线程的请求顺序,一个线程一个线程的往下面传递。这种传递的属性是通过将线程封装成Node,并且加入到链表中的方式实现的。

线程被封装的方式:

 Node node = new Node(Thread.currentThread(), mode);
       Node(Thread thread, Node mode) {     // Used by addWaiter
this.nextWaiter = mode;
this.thread = thread;
}

NonfairSync:锁被释放了之后,谁先获取到锁谁就拥有锁。

非公平锁的效率会比公平锁的实现效率高。

对于非公平锁来说,如果线程加入到了队列(被封装成线程的一个一个Node)中,想要获取到锁,就要按照队列的顺序取获取,但是如果有其他的线程想要获取锁,那么队列中的线程竞争的锁,没有其他线程获取到的机率大。

最新文章

  1. ASP.NET 中 OutputCache 指令参数详解
  2. Google的Protobuf协议分析
  3. 00 MySQL
  4. 响应式Web初级入门
  5. MVC4中重复使用JQuery Mobile Dialog的做法实践.
  6. MVC导出Excel,提供下载Excel
  7. hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)
  8. Codeforces Round #326 (Div. 2) B. Duff in Love 分解质因数
  9. 使用C#动态生成Word文档/Excel文档的程序测试通过后,部署到IIS服务器上,不能正常使用的问题解决方案
  10. Innodb buffer pool/redo log_buffer 相关
  11. 用java制作日历,想休息的时候看一看离周末还有几天!
  12. Zoj 3842 Beauty of Array
  13. Oracle sql 查询结果某一列字段合并成为一条数据
  14. 表空间tablespace,数据文件datafiles,和控制文件control files介绍
  15. 树形dp总结
  16. RBM如何训练?
  17. pip安装selenium报错:Read timed out
  18. nyoj 聪明的kk
  19. Oracle Enterprise Linux 64-bit 下Oracle11g的监听配置修改及测试步骤
  20. java之过滤器

热门文章

  1. 【Sikuli】Sikuli 文档
  2. 3. Install Spring-Tool-Suite & TestNG
  3. python之BeautifulSoup模块
  4. CSS 关键的基础知识
  5. centos6.8下redis的安装和配置
  6. 编写属于自己的linux命令
  7. Java中的I/O 线程 网络
  8. hdu 5003 模拟水题
  9. Hibernate中OpenSessionInViewFilter(通常配置在web.xml文件中)的作用
  10. Spring的@ModelAttribute注解