ReentrantReadWriteLock
setState()
compareAndSetState()
tryAcquire()
tryAcquireShared()
fair
false
FairSync
NoFairSync
public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); }
可重入锁又名递归锁,是指在同一个线程在外层方法获取锁的时候,再进入该线程的内层方法会自动获取锁(前提锁对象得是同一个对象或者class),不会因为之前已经获取过还没释放而阻塞。Java中ReentrantLock和synchronized都是可重入锁,可重入锁的一个优点是可一定程度避免死锁。下面用示例代码来进行分析:
synchronized
Mark Word
无锁
偏向锁
0 + 01
00
-XX:+UseBiasedLocking
-XX:-UseBiasedLocking
轻量级锁
Lock Record
Displaced Mark Word
重量级锁
10
CPU
-XX:PreBlockSpin
JDK1.4.2
JDK1.6
1. Java中的乐观锁与悲观锁
2. 一个线程怎么判断自己是否可以获得共享资源的锁?
lock()
ReentrantLock
3. 共享资源state何时增加何时减少?对于synchronized和lock有什么区别?
state = 0
1 + 01
4. 对于++i操作,如何不使用锁进行同步,保证其线程安全?
5. CAS操作的实现机制?
6. 公平锁与非公平锁
NonfairSync
7. lock ,sychronized,volatile的区别
volatile
sychronized
tryLock
lockinterruptibly
wait()
notify()/notifyAll()
await()
signal()/signalAll()
8. 谈一下Java中的锁
JDK1.5及以后
VS
9. synchronized关键字和ReentrantLock
10. 共享锁与独占锁
11. 单例模式如何解决高并发?
instance
null
12. AQS和condition对象的关系
ConditionObject
signal()
13. lock接口的实现
unlock()