当线程进入Java中的同步块/方法时会发生什么情况

瓦迪姆·西多罗夫(Vadym Sidorov)

我很好奇,当我的线程进入同步块并阻塞监视器时,下面会发生什么。

它实际上是否在尝试使用此监视器的所有其他线程上隐式调用wait()?还是监视器有一些特定的标志需要更改?

另外,当我们离开同步块时会发生什么?是否以某种方式调用当前监视器的notify或notifyAll?

我对此真的很纠结。

安迪

我认为最好从基础同步原语方面来考虑:java监视器是一个互斥锁,一个同步块是一个互斥锁被锁定{和解锁}并等待,notify和notifyAll是对相关条件变量进行调用的方法的区域。与互斥。

要记住的重要一点是,互斥锁在wait()调用时可以在同步块内解锁,因为等待将解锁互斥锁并阻塞,直到调用notify或notifyAll为止

因此,尽管推断不可能,但多个线程仍可以在同步块内被阻塞。

更新:带注释的代码说明了这一点:

Object lock;
// ...
synchronized (lock) { // Underlying mutex is locked.
    // ...
    lock.wait(); // Unlocks mutex, blocks until notify, relocks mutex
    // ...
} // Underlying mutex unlocked

一旦lock.wait()调用,其他线程就可以自由进入同步块它们也会阻塞直到alock.notify()lock.notifyAll()唤醒它们。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在同步方法内部的线程中的同步块会发生什么情况?

Java:从同步块启动新线程时会发生什么?

当线程在同步块内崩溃时,锁会发生什么情况?

在Git中删除分支时会发生什么情况

将属性应用于python中的类方法时会发生什么情况?

当您使用“ + =”在Java中“更改”字符串时会发生什么情况?

当我在Clojure中从多个线程定义一个变量时会发生什么情况?

如果我使用JNI从C的多个线程中调用Java函数,会发生什么情况?

如果我们在Java多线程中的executorService执行调用中传递线程,会发生什么情况

设置IIS池的LoadUserProfile时会发生什么情况?

在Haskell中用+编写*时会发生什么情况?

将函数用作参数时会发生什么情况?

等待同步方法时会发生什么

实例化python类但未定义__init __()方法时会发生什么情况?

当无效的amp页面在Google缓存中缓存并打开缓存网址时会发生什么情况

VB.NET中的类型之间进行转换时会发生什么情况?

等待加入条件变量的线程会发生什么情况?

Java字节码中有多个静态块会发生什么情况?

将方法作为目标执行的线程会发生什么情况

堆内存泄漏期间Java线程会发生什么情况?

从C中main返回时,正在运行的线程会发生什么情况?

结束后在进程中启动的线程会发生什么情况

当我们在方法内部创建锁(同步块)对象时会发生什么?

当几个线程试图调用相同的同步方法时会发生什么?

当Java线程无法执行同步语句时会发生什么?

当我在Amazon S3中将Quiet设置为true以便在deleteObjects()方法中启用安静模式时会发生什么情况?

如果我在线程池中发布了工作并且线程已经在Boost中工作,会发生什么情况?

在Java函数中创建并存储在对象中的对象会发生什么情况?

如果不引用对象,Java中的对象会发生什么情况,例如:myString.concat(“ that”)