java并发3JDK8的各种锁
1 各种锁的概念与实现与实现原理
1.1 悲观锁VS乐观锁
1.1.1 概念:
1.1.2 实现:
1.1.3 原理:
1.2 公平锁VS非公平锁
1.2.1 概念:
1.2.2 实现:
1.2.3 实现:
1.3 重入锁VS不可重入锁
1.3 .1 概念:
1.3 .2 实现:
1.3 .3 实现:
1.4 共享锁VS排它锁/独占锁/互斥锁
1.4.1 概念:
1.4.2 实现:
1.5 自旋锁与自适应自旋锁
1.5.1 概念:
1.5.2 实现:
1.5.3 原理:
1.6 无锁与偏向锁与轻量级锁与重量级锁
1.6.1 概念:
1.6.2 实现:
1.7 分拆锁VS分离锁
1.7.1 概念:
1.7.2 实现:
1.8 死锁VS活锁
1.8.1 概念:
1.9 阻塞锁VS非阻塞锁
1.9.1 概念:
2 JDK8中的各种显示锁的源码阅读与讲解
2.1 Lock
2.2 Condition
2.3 AbstractOwnableSynchronizer
2.4 AbstractQueuedSynchronizer
2.4.1 简介
2.4.2 关键字段 state
2.4.3 内部类 Node
2.4.3 内部类 ConditionObject
2.4.4 关键方法 acquire
2.4.5 关键方法 release
2.4.6 其他内容
2.5 AbstractQueuedLongSynchronizer
2.6 ReentrantLock
2.7 LockSupport
2.8 ReadWriteLock
2.9 ReentrantReadWriteLock
2.9.1 内部类Sync
2.9.2 内部类ReadLock
2.9.3 内部类WriteLock
2.10 StampedLock
3 小结
1 各种锁的概念与实现与实现原理
1.1 悲观锁VS乐观锁
1.1.1 概念:
访问共享资源时,需不需要加锁?
悲观锁:加锁。
乐观锁:不加锁。
1.1.2 实现:
悲观锁:synchronized,JDK中的实现了LOCK接口的锁。
乐观锁:原子类,如AtomicInteger
1.1.3 原理:
悲观锁:通过队列来进行加锁和释放锁
乐观锁:通过CAS
1.2 公平锁VS非公平锁
1.2.1 概念:
访问共享资源时,获取锁的顺序?
公平锁(fair lock):最先请求锁的线程优先获取锁。
非公平锁(nonfair lock):如果锁空闲,线程请求锁的时候,可以跳到等待锁队列的最前面。
1.2.2 实现:
公平锁(fair lock):ReentrantLock,可以通过构造函数设置公平性
非公平锁(nonfair lock):synchronized。ReentrantLock,可以通过构造函数设置公平性
1.2.3 实现:
公平锁(fair lock):加锁时,判断,该线程是否是在队列的第一个位置,且锁空闲,则获取锁
非公平锁(nonfair lock):加锁时,不判断,该线程是否是在队列的第一个位置,且锁空闲,则获取锁
1.3 重入锁VS不可重入锁
1.3 .1 概念:
访问共享资源时,线程A获取了锁B,线程A是否可以再不释放锁B的情况下,再一次获取锁B?
重入锁(reentrant Lock):可以
不可重入锁(no reentrant Lock):不可以。
1.3 .2 实现:
重入锁(reentrant Lock):synchronized,ReentrantLock,
不可重入锁(no reentrant Lock):自行实现吧,比较简单。java中的锁都是重入锁,原因是重入锁支持递归。也可以下载并查看netty项目中的NonReentrantLock
1.3 .3 实现:
重入锁(reentrant Lock):保存持有锁的线程和和线程加锁解锁的计数器。
不可重入锁(no reentrant Lock):没有啥特别的吧。
1.4 共享锁VS排它锁/独占锁/互斥锁
1.4.1 概念:
锁可以被多个线程所拥有吗?
共享锁(shared lock):可以被多个线程所拥有。
排它锁/独占锁/互斥锁(mutual exclusion lock):只能被一个或者0个线程所拥有。
1.4.2 实现:
共享锁(shared lock):ReentrantReadWriteLock中的read lock
排它锁/独占锁/互斥锁(mutual exclusion lock):synchronized。ReentrantLock
1.5 自旋锁与自适应自旋锁
1.5.1 概念:
自旋锁:当获取锁不成功时,过一段时间再次获取锁,如此循环几次。
自适应自旋锁:当获取锁不成功时,过一段时间再次获取锁,如此循环几次。并根据以往的经验确定需要循环的次数。
1.5.2 实现:
自旋锁:synchronized。
自适应自旋锁:synchronized。
1.5.3 原理:
自旋锁:通过循环实现,循环的次数来实现
自适应自旋锁:通过循环实现,循环的次数,和该线程曾经获取锁的成功率来实现
1.6 无锁与偏向锁与轻量级锁与重量级锁
1.6.1 概念:
JVM对synchronized进行优化时,针对竞争程度,有区别的使用锁。
无锁:当竞争程度较低,使用CAS获取或者修改共享资源。
偏向锁:只有一个线程时,当该线程来获取锁,直接把锁给该线程。
轻量级锁:偏向锁时,有其他线程来竞争时,会升级为轻量级锁,其他线程自旋获取锁。
重量级锁:轻量级锁时,有其他线程来竞争时,会升级为重量级锁,其他线程进入阻塞状态。
1.6.2 实现:
无锁:ynchronized。
偏向锁:synchronized。
轻量级锁:synchronized。
重量级锁:synchronized。
1.7 分拆锁VS分离锁
1.7.1 概念:
为了提高性能,把锁拆分的不同情况。
分拆锁(lock splitting):一把锁拆成两个
分离锁(lock striping):一把锁拆成多个
1.7.2 实现:
分拆锁(lock splitting):ReentrantReadWriteLock
分离锁(lock striping):ConcurrentHashMap
1.8 死锁VS活锁
1.8.1 概念:
是一种不正当使用锁时,表现出的一种异常现象,对线程活跃性有非常大的危害
死锁(dead lock ):两个线程都在等待对方释放锁
活锁(live lock):两个线程同时竞争锁,同时为了礼让对方而放弃锁。
1.9 阻塞锁VS非阻塞锁
1.9.1 概念:
获取不到锁时,线程的状态。
阻塞锁(block lock ):进入block状态。
非阻塞锁(noblock lock):不进入block状态,并尝试再次获取锁。
浙公网安备 33010602011771号