JAVA的锁机制

JAVA的锁机制

JAVA的锁机制——按照性质划分

一、公平锁&非公平锁

  1. 公平锁 ,多个线程按照申请锁的顺序依次获取锁。
  2. 非公平锁 多个线程获取锁的顺序未按照申请锁的顺序来获取,会造成线程饥饿现象,获取不到锁。
    由于ReentrantLock是通过AQS来实现线程调度,可以实现公平锁,,但是synchroized是非公平的,无法实现公平锁。

AQS全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包,AbstractQuenedSynchronizer抽象的队列式同步器。是除了java自带的synchronized关键字之外的锁机制。
详细介绍可参考此链接 https://blog.csdn.net/mulinsen77/article/details/84583716

二、乐观锁&悲观锁

  1. 乐观锁 ,就是考虑问题很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁。

实现:在表里边加一个vesion 例子:
Select max(nub) ,version from biao
Update biao set nub=nub+1,version=vsersion+1 where id=id and version =version

  1. 悲观锁 就是考虑问题很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁。

实现:sql语句后边加上for update
例子:Select id,nam from biao for update

三、独享锁&共享锁

  1. 独享锁 ,该锁一次只能被一个线程所持有;
  2. 共享锁 可以被多个线程所持有。
    在java中,ReentrantLock对象与synchroized关键字是独享锁;ReadWriteLock接口中,读是共享锁,保证并发读的效率;写是独享锁;读写、写写、写读过程都是互斥的,独享的。
    独享锁与共享锁在lock中通过AQS(抽象队列同步器)实现。

四、互斥锁&读写锁

  1. 互斥锁 ,synchronized关键字以及Lock接口实现类ReentrantLock;
  2. 读写锁 在java中的具体实现就是ReentrantReadWriteLock。

五、可重入锁

  1. 可重入锁 ,又名递归锁,是指同一个线程在外层的方法获取到了锁,在进入内层方法会自动获取到锁。对于ReentrantLock和synchronized关键字都是可重入锁的。
    最大的好处就是能够避免一定程度的死锁

六、自旋锁&自适应自旋锁

底层采用CAS来保证原子性,自旋锁获取锁的时候不会阻塞,而是通过不断的while循环的方式尝试获取锁。

优点减少线程上下文切换的消耗,缺点是会消耗CPU。如果锁被占用的时间很短,自旋等待的效果就会非常好。
缺点如果锁被占用的时间很长,那么自旋的线程只会白白消耗处理器资源,而不会做任何有用的工作,反而会带来性能上的浪费。

七、偏向锁&轻量级锁&重量级锁

  1. 偏向锁减少线程上下文切换的消耗,缺点是会消耗CPU。如果锁被占用的时间很短,自旋等待的效果就会非常好。
  2. 轻量级锁当锁是偏向锁的时候,被另一个线程所访问,偏向锁就会升级为轻量级锁,其他线程会通过自旋的形式尝试获取锁,不会阻塞,提高性能。
  3. 重量级锁当锁为轻量级锁的时候,另一个线程虽然是自旋,但自旋不会一直持续下去,当自旋一定次数的时候,还没获取到锁就会进入阻塞,该锁膨胀为重量级锁。重量级会让其他申请线程阻塞,性能降低。

八、分段锁

分段锁其实是一种锁的设计,并不是具体的一种锁,对于ConcurrentHashMap而言,其并发的实现就是通过分段锁的形式来实现高效的并发操作。我们以ConcurrentHashMap来说一下分段锁的含义以及设计思想,ConcurrentHashMap中的分段锁称为Segment,它即类似于HashMap(JDK7与JDK8中HashMap的实现)的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同时又是一个ReentrantLock(Segment继承了ReentrantLock)。

当需要put元素的时候,并不是对整个hashmap进行加锁,而是先通过hashcode来知道他要放在那一个分段中,然后对这个分段进行加锁,所以当多线程put的时候,只要不是放在一个分段中,就实现了真正的并行的插入。

但是,在统计size的时候,可就是获取hashmap全局信息的时候,就需要获取所有的分段锁才能统计。分段锁的设计目的是细化锁的粒度,当操作不需要更新整个数组的时候,就仅仅针对数组中的一项进行加锁操作。

原文博主写的更详细哦!
链接:https://blog.csdn.net/cuichunchi/article/details/88532582

你可能感兴趣的:(锁机制)