1、代码案例:
package multiThread.art;
import java.util.concurrent.locks.ReentrantLock;
/**
* 使用 ReentrantLock 进行加锁
*/
public class ReentrantLockExample {
int a = 0;
ReentrantLock lock = new ReentrantLock();
public void writer(){
// 获取锁
lock.lock();
try{
a++;
}finally {
// 释放锁
lock.unlock();
}
}
public void reader(){
// 获取锁
lock.lock();
try{
int i = a ;
}finally {
// 释放锁
lock.unlock();
}
}
}
2、 ReentrantLock 源码分析:
说明1: ReentrantLock 分为“ 公平锁”和“非公平锁”。 new ReentrantLock() 默认使用的是“非公平锁”。
【补充: 非公平锁的开销相对小点(考虑的角度:上下文切换的次数)】
说明2: ReentrantLock 的实现,依赖的核心变量是: AbstractQueuedSynchronizer 中声明的
private volatile int state 。
说明3: 公平锁的实现逻辑
“加锁”的时候, state 的值由 0 变为 1 ;
“释放锁”的时候,state 的值由 1 变为 0
说明4 : volatile 变量值的更改:依赖的是 CAS 实现
说明5: 公平锁:保证了锁的获取按照 FIFO 的原则,而代价是进行大量的线程切换。
非公平锁: 虽然可能造成线程“饥饿”,但极少的线程切换,保证了其更大的吞吐量。
说明6: 源码执行逻辑【部分图解】