Java-锁与实现

Posted ~花开不败~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-锁与实现相关的知识,希望对你有一定的参考价值。

1. 锁的分类与实现

2. 具体实现

  可重入锁:

  可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,在进入内层方法会自动获取锁。

  偏向锁/轻量级锁/重量级锁:

  偏向锁:指一段同步代码一直被一个线程所访问,那么该线程会自动获取锁。降低获取锁的代价。
  轻量级锁:指当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
  重量级锁:指当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没有获取到锁,就会进入阻塞,该锁膨胀为重量级锁。重量级锁会让其他申请的线程进入阻塞,性能降低。

  自旋锁:

  自旋锁:指尝试获取锁的线程不会立即阻塞,而是采用循环的方式去尝试获取锁,这样的好处是减少线程上下文切换的消耗,缺点是循环会消耗CPU。

  具体实现:

  使用CAS原子操作,lock函数将owner设置为当前线程,并且预测原来的值为空。unlock函数将owner设置为null,并且预测值为当前线程。

当有第二个线程调用lock操作时由于owner值不为空,导致循环一直被执行,直至第一个线程调用unlock函数将owner设置为null,第二个线程才能进入临界区。

由于自旋锁只是将当前线程不停地执行循环体,不进行线程状态的改变,所以响应速度更快。但当线程数不停增加时,性能下降明显,因为每个线程都需要执行,占用CPU时间。如果线程竞争不激烈,并且保持锁的时间段。适合使用自旋锁。

  

以上是关于Java-锁与实现的主要内容,如果未能解决你的问题,请参考以下文章

Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

悲观锁与乐观锁以及如何用java语言和mysql实现

带你快速了解Java锁中的公平锁与非公平锁

java并发编程的艺术——第五章总结(Lock锁与队列同步器)

Java 多线程之内置锁与显示锁