Java锁对象是否强制执行“先发生后发生”关系?

Java锁对象是否强制执行“先发生后发生”关系?,java,multithreading,locking,memory-model,happens-before,Java,Multithreading,Locking,Memory Model,Happens Before,Java在并发包中提供了一个锁对象,根据文档提供了比使用同步方法和语句更广泛的锁操作。 同步方法/块除了互斥之外,还强制执行“发生在之前”关系,确保一个线程对变量所做的更改对另一个线程可见 使用锁对象时是否会发生这种关系?是否像所有平台的同步块一样保证观测?是的,保证 锁定对象的工作原理与 同步代码与隐式锁一样,只有一个线程可以拥有 一次锁定对象。锁定对象还支持等待/通知 机制,通过其关联的条件对象 从 使用锁对象时是否会发生这种关系?是观察 保证像所有平台的同步块一样 是的 有几个操作是在关系

Java在并发包中提供了一个锁对象,根据文档
提供了比使用同步方法和语句更广泛的锁操作。

同步方法/块除了互斥之外,还强制执行“发生在之前”关系,确保一个线程对变量所做的更改对另一个线程可见

使用锁对象时是否会发生这种关系?是否像所有平台的同步块一样保证观测?

是的,保证

锁定对象的工作原理与 同步代码与隐式锁一样,只有一个线程可以拥有 一次锁定对象。锁定对象还支持等待/通知 机制,通过其关联的条件对象

使用锁对象时是否会发生这种关系?是观察 保证像所有平台的同步块一样

是的

有几个操作是在关系发生之前创建的,其中一个是synchronization(),Java的lock对象也用于此目的

阅读Oracle文档中的Java。除以下链接中突出显示的内容外

在下文中,“扩展这些保证”表示内存一致性属性,如“之前发生”关系
Lock
类属于
java.util.concurrent
的子包,因此它保证了内存一致性属性,如“之前发生”关系等

java.util.concurrent及其子包中所有类的方法 将这些保证扩展到更高级别的同步


内存一致性属性文档还明确指出:“释放”同步器方法之前的操作,如Lock.unlock、Semaphore.release和CountDownLatch.countDown,发生在成功“获取”之后的操作之前方法,例如Lock.Lock、Semaphore.acquire、Condition.await和CountDownLatch.await,它们位于另一个线程中的同一同步器对象上。“是的,这是阅读
java.util.concurrent
包中的原因、方式和内容的最佳页面之一。您在这里所说的一切都是正确的,但您没有回答这个问题。@jameslarge:java锁对象是否强制执行“发生在之前”关系?是的,它强制执行。与隐式锁一样,一次只能有一个线程拥有一个锁对象——这不是一个答案吗?是的,但您的答案只涉及互斥和条件变量。它没有说“以前发生过”任何地方。“发生在”保证的概念与在给定时间内有多少线程可以拥有一个互斥锁是完全不同的主题。@jameslarge:很抱歉,您没有理解它,但是“发生在”保证的概念与一次只有一个线程可以拥有一个锁对象这一事实直接相关。这是怎么回事?互斥体从一开始就在Java中出现,但是在Java互斥体中第一次提到类似“之前发生”的关系是在Java 5平台上实现的。我不知道有任何理论认为,如果不在线程之间提供内存一致性,就无法实现互斥。(我知道一些书解释了为什么你不应该这么做。)