【发布时间】:2017-03-26 14:43:21
【问题描述】:
根据java源码
ReentrantLock 的锁(非公平)如下。
public boolean lock(){
int c=getState();
if(c==0){
compareAndSetState(0,1);
}
}
//getState method
public int getState(){
return state;
}
public boolean compareAndSetState(int expected,int update){
unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
stateOffSet 的值是 state 在内存中的偏移量(使用反射)。
我从上面的代码可以理解的是,当我们调用 lock.lock() 时,state 字段的第一个值在内存中检查,如果它为零,那么只有锁被赋予调用线程.
所以我的问题是当我们使用同步关键字时会发生什么?在 Synchronized 中是否也检查并设置了一些锁定字段?
还有一个疑问,我在某处读到可重入锁允许多个等待队列,这是什么意思?我们不是只有一个队列吗?
【问题讨论】:
-
"(使用反射)" - 不,没有使用反射。它在这里没有用,而且太慢了。要了解同步的工作原理,只需阅读有关同步工作原理的教程。不,实现与 ReentrantLock 不同,尽管它确实实现了许多非常相似的目标,但不是所有目标(如果有,就不需要 ReetrantLock)
-
根据 grepcode 我可以看到 stateOffset = unsafe.objectFieldOffset (AbstractQueuedSynchronizer.class.getDeclaredField("state"));当然 ReentrantLock 比我写的要多得多,但是我在 ReentrantLock 状态值的问题决定,是锁可用还是被其他线程锁定。在 Synchronized 中会发生什么?我找不到给出它的任何链接,当我们使用 Synchronized 时 jvm 内部会做什么。
标签: java reflection concurrency locking reentrantlock