老师,你好,这是我第二遍研读你的课程了,每一遍都收获很大。第一次写留言有点紧张。
你上面写的jdk利用内存模型的三条规则来保证可见性,是正确的。但我觉得好像描述的理由好像不充分,我不知道我理解的对不对,请老师解答一下
我的理解应该是 :1)释放锁成功后,写state的值 (unlock>state-=1) 顺序性
2)获取锁前,读state值(state>lock)顺序性
3)传递性 unlock>lock
下面是jdk的源码
final boolean nonfairTryAcquire(int acquires) {
final Thread current = Thread.currentThread();//获取当前线程实例
int c = getState();//获取state变量的值,即当前锁被重入的次数
if (c == 0) { //state为0,说明当前锁未被任何线程持有
if (compareAndSetState(0, acquires)) { //以cas方式获取锁
setExclusiveOwnerThread(current); //将当前线程标记为持有锁的线程
return true;//获取锁成功,非重入
}
}
else if (current == getExclusiveOwnerThread()) { //当前线程就是持有锁的线程,说明该锁被重入了
int nextc = c + acquires;//计算state变量要更新的值
if (nextc < 0) // overflow
throw new Error("Maximum lock count exceeded");
setState(nextc);//非同步方式更新state值
return true; //获取锁成功,重入
}
return false; //走到这里说明尝试获取锁失败
}
展开
作者回复: 感谢补充😄state必须是volatile变量,否则是不会有unlock>lock的,我比你更紧张😂