java - 在一个对象上嵌套同步块
问题描述
线程的当前实例是否有可能锁定自身并导致死锁?例如,在这部分代码中,我认为当前线程实例无法进入第二个同步块,因为它已经在 s1 上锁定并且无法再次锁定它。但代码不能那样工作。并在第二个同步块中打印消息。有人可以向我解释我错过了什么吗?谢谢你。
public class DeadLock {
final String s1="s1";
Thread t1=new Thread("t1"){
@Override
public void run() {
synchronized (s1) {
synchronized (s1) {
System.out.println(" t1 thread..");
}
}
}
};
public static void main(String[] args) {
DeadLock deadLock=new DeadLock();
deadLock.t1.start();
}
}
解决方案
Java 监视器是可重入的。您在代码中演示的嵌套锁定工作得很好。当您可以从其他同步方法调用同一对象的同步方法时,就会发生这种情况。
推荐阅读
- reactjs - 如何使用 react redux 和 firebase connect 更改帖子中的评论
- python - loop.run_until_complete 给出“TypeError: An asyncio.Future, a coroutine or an awaitable is required”
- arrays - 如何将 RestApi 对象数据转换为数组?
- amazon-web-services - 如何在 AWS Lambda 函数中使用 ImageMagick
- .net - Get-Content 在 Windows 7 环境中返回 System.Object[] 而不是 System.String
- r - 努力使用 read_tsv() 代替 read.csv()
- android - Kotlin - java.lang.IllegalStateExpection:应为 BEGIN_ARRAY 但为 STRING
- c++ - 在 macOS 上将文件内容读取到 wchar_t (4Bytes) 的正确方法是什么?
- excel - 如何根据两个参数在表格中查找单元格(Excel)
- c# - 更改 WPF ListView 中的小数点分隔符(绑定、字符串格式)