Java中的内在锁和同步

Java中的内在锁和同步,java,multithreading,synchronization,Java,Multithreading,Synchronization,根据Oracle文档: 内在锁在同步的两个方面都起作用: 强制对对象状态的独占访问并建立 发生在对可见性至关重要的关系之前 我的问题是: 在同步上下文中,在关系之前发生了什么?这是否意味着一旦一个线程执行了一个同步块,所有更改都会在其他线程到来并重新获取锁之前刷新到主内存 我还有一个问题: 假设thread1已获取锁并正在执行同步块 JVM/thread scheduler是否可以强制thread1进入另一个状态(如wait),这样它将释放锁,而另一个线程(如thread2将获取锁?现在,一段时

根据Oracle文档:

内在锁在同步的两个方面都起作用: 强制对对象状态的独占访问并建立 发生在对可见性至关重要的关系之前

我的问题是:

在同步上下文中,在关系之前发生了什么?这是否意味着一旦一个线程执行了一个同步块,所有更改都会在其他线程到来并重新获取锁之前刷新到主内存

我还有一个问题:

假设thread1已获取锁并正在执行同步块

JVM/thread scheduler是否可以强制thread1进入另一个状态(如wait),这样它将释放锁,而另一个线程(如thread2将获取锁?现在,一段时间后,thread1可以再次进入运行状态,并从失去锁的位置开始运行

这里的关系在同步之前意味着什么 背景

这种关系只是一种假设,即一条特定语句写入的内存对另一条特定语句可见。在本例中,这意味着当您在synchronized块中写入某些内容时,进入synchronized块的其他线程将注意到此更改

JVM/线程调度器是否可以强制执行thread1 另一个状态表示等待,以便释放锁,另一个状态表示等待 线程说线程2将获得锁


不,虽然线程可以通过调用
wait

释放锁,但线程调度程序是否可以取消持有锁的线程的调度?我在与多线程相关的一些其他问题的评论中提出了相同的问题,回答者提到,这可能会导致我对相同问题的混淆。我自己认为这不应该被允许,因为它可能会导致
可见性问题,比如在
读更新写操作中。拥有锁的线程可能已经读取并更新了变量。在它可以写入变量之前,它可能是未计划的,并且必须释放锁。现在,其他线程可以获取锁并执行读更新写操作。你能告诉我我的推理是否正确吗?谢谢。JVM保证代码在
synchronized
块互斥中,除非线程调用
wait
来提供锁。。。我真的不知道你所说的计划外是什么意思。。。也许你可以把这个链接发布到与多线程相关的其他问题上,我会检查它。@YugSingh我知道你现在在说什么。是的,可能是临时安排的。但这并不意味着其他线程可以访问代码。尝试执行同步块的其他线程将被阻止!直到该线程得到调度并完成同步块。