Java并发编程-ReentrantLock

时间:2023-03-09 01:32:17
Java并发编程-ReentrantLock

代码示例:

Lock lock = new ReentrantLock();
lock.lock();
try {
// update object state
} finally {
lock.unlock();
}

相比synchronized的优势

1.具有更好的并发性能,激烈争用情况下更佳的性能

2.添加了类似锁投票、定时锁等候和可中断锁等候的一些特性

源码分析:

点击lock方法,进入代码(NonfairSync):

final void lock() {
//假设原始值是0
//那么获取锁之后,将值设为1
//并设置私有线程
if (compareAndSetState(0, 1))
setExclusiveOwnerThread(Thread.currentThread());
else
//如果值不是期望值0,则说明被其它线程占用锁
//加锁失败,再次尝试加锁,失败则加入等待队列,
//等待队列中会一直尝试加锁
//如果队列加锁不成功,那么进入中断
acquire(1);
}

compareAndSetState方法运用了CAS

比较并替换的原理,此处是原子操作

参考文章:http://blog.****.net/fw0124/article/details/6672522