java中锁分类

1、自旋锁

当线程请求锁时,发现锁已经被别的线程持有,那么该线程不放弃处理器的执行时间,进行自旋,观察自旋锁保持者是否已经释放了锁。

JDK1.6中引入了自适应的自旋锁。自适应意味着自旋的时间不再固定,而是由前一次在同一锁上的自旋时间及锁的拥有者的状态决定。如果在同一个锁对象上,自旋等待刚刚成功获得锁,并且持有锁的线程正在运行中,那么虚拟机就会认为这次自旋也很有可能再次成功,进而它将允许自己自旋等待的时间更长,比如100个循环。另外,如果对于某个锁,自旋很少成功获得过,那在以后要获取这个锁时将可能省略掉自旋过程,以避免浪费处理器资源。

因为阻塞线程和唤醒线程都需要从用户态转换为核心态,会产生性能问题。

2、公平锁

公平锁是指多个线程按照锁的顺序来获取锁。

3、非公平锁

非公平锁是指多个线程获取锁的顺序并不是按照申请锁的顺序。

4、可重入锁

当前拥有锁的线程可以再一次获得该锁。

5、乐观锁

是一种乐观思想,即认为读多写少,遇到并发写的可能性比较低,每次去拿数据的时候都认为被人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,即当前版本号与原来的版本号是否相等,若相等就更新,否则不进行更新。CAS就是乐观锁的一种实现。

6、悲观锁

是一种悲观思想,即认为写多,遇到并发写的可能性比较高,每次去拿数据的时候都认为别人会修改,所以每次都会上锁,这样别人想读写这个数据就会阻塞直到拿到锁。例如sychronized。

7、轻量级锁

通过CAS对线程进行加锁和解锁。

8、偏向锁

    这个锁会偏向于第一个获得它的线程,如果在接下来的执行操作中,该锁没有被其他线程获取,则持有偏向锁的线程将永远不需要再进行同步。

    当锁对象第一次被线程获取的时候,虚拟机将会把对象头中的标志位设置为“01”,即偏向模式。同时使用CAS操作将获得这个锁的线程的ID记录在Mark Word中,如果CAS操作成功,持有偏向锁的线程以后每次进入这个锁相关的同步块时,虚拟机都可以不再进行任何同步操作。当有另一个线程尝试去获取这个锁时,偏向模式就宣告结束。




猜你喜欢

转载自blog.csdn.net/g1607058603/article/details/80893711