Java 中的各类锁

锁的类型 锁的实现
乐观锁 在数据库中能够使用version版本号去实现;在Java中是使用CAS(Compare And Swap)算法(CAS算法:是一种无锁算法,是Java提供的非阻塞原子性操做,CAS经过硬件保证了比较更新的原子性,在JDK中Unsafe提供了一系列的compareAndSwap*方法;CAS有ABA问题,解决办法:在JDK1.5后加入了AtomicStampedReference方法给每一个变量加入了一个时间戳来避免ABA问题。)来实现,在并发包(java.util.concurrent)中原子类都是使用CAS来实现乐观锁的。
悲观锁 synchronized关键字、Lock的实现类
公平锁 多个线程同时申请锁的话,线程会放入一个队列中,在队列中第一个进入队列的线程才能获取锁资源,讲究的是先到先得。new ReentrantLock(true) 提供了公平锁的实现。
非公平锁 new ReentrantLock(false) 提供了非公平锁的实现。
独占锁(排他锁) 独占锁就是每次只有一个线程能霸占这个锁资源,而其余线程就只能等待当前获取锁资源的线程释放锁才能再次获取锁;ReentrantLock 就是独占锁,其实准确的说独占锁也是悲观锁。
共享锁 共享锁其实也是乐观锁,它放宽了锁的策略容许多个线程同时获取锁。在并发包中 ReadWriteLock 就是一个典型的共享锁,它容许一个资源能够被多个读操做访问,或者被一个写操做访问,但二者不能同时进行。
自旋锁 自旋锁其实就是当一个线程获取锁的时候,这个锁已经被其余人获取到了,那么这个线程不会立马挂起,反而在不放弃CPU使用权的状况下会尝试再次获取锁资源,默认次数是10次,能够在JVM中使用-XX:PreBlockSpin官方说明)来设置次数。若是自旋锁获取锁的时间太长,会形成后面的线程CPU资源耗尽释放。而且自旋锁是不公平的。

出处:https://mp.weixin.qq.com/s/G4zfnAQH-PJz8jUREX41OAhtml

相关文章
相关标签/搜索