首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java并发: ReentrantLock是一个错误的设计吗?

Java并发: ReentrantLock是一个错误的设计吗?
EN

Stack Overflow用户
提问于 2017-03-23 03:22:03
回答 1查看 266关注 0票数 3

我知道AbstractQueuedSynchronizer(AQS)使用ReentrantLock来实现Lock。但细节的实现,我无法理解。

我知道AQS使用易失性,CAS和spin进行同步。但是,这些行为只控制“国家”成员。

虽然,LockSupport.parkLockSupport.unpark可以同步线程的进程。但是,如果从来没有争用,LockSupport方法将永远不会被调用。如下所示:1.线程--启动和运行

2.线程B启动和运行

3.线A:

代码语言:javascript
复制
lock.lock();
try{
  //modify some shared members
  ....
}finally{
  lock.unlock();
}

4.然后是线程B:

代码语言:javascript
复制
lock.lock();
try{
  //read shared members
  ....
}finally{
  lock.unlock();
}

没有争用,线程B不调用LockSupport方法。

lock.unlock()只将lock.lock() "state“成员,并将易失性的”状态“修改为0。

为什么线程B可以看到线程A关于共享成员的修改?

为什么ReentrantLock可以用作“同步”?

我没有看到任何像fullFence这样的代码来同步内存。

哪一种代码实现线程进程的同步?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-03-23 07:40:00

CAS操作定义发生在关系之前,因此Java内存模型保证来自线程的内存修改将从另一个线程中可见。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42966669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档