java - 为什么同步功能不阻止进入?(JAVA)
问题描述
我有 2 个类,我想与它们创建一个死锁。我试图创建两个相互读取的同步函数 - 因此该过程将被卡住。但不是进程被卡住,而是函数继续相互调用。我不明白为什么会发生这种情况,一旦同一个函数中有另一个进程,同步关键字应该阻止一个进程进入该函数。
我的运行:
public class MyRun extends Thread{
MyRun1 myRun1;
MyRun(){
myRun1 = new MyRun1(this);
}
public synchronized boolean f(){
System.out.println("MyRun.f()");
while (!myRun1.f()){
}
return true;
}
}
我的运行2:
public class MyRun1 extends Thread {
MyRun myRun;
MyRun1(MyRun myRun){
this.myRun = myRun;
}
public synchronized boolean f(){
System.out.println("MyRun1.f()");
while (!myRun.f()){}
return true;
}
}
主要的:
public static void main(String[] args){
MyRun myRun = new MyRun();
myRun.f();
}
输出:
MyRun.f()
MyRun1.f()
MyRun.f()
MyRun1.f()
.
.
.
.
Exception in thread "main" java.lang.StackOverflowError
解决方案
您的所有代码都在主线程上运行,因为您没有启动任何其他线程。因此,您的方法是否无关紧要synchronized
,因为执行是顺序的。
你必须打电话myRun.start()
才能开始Thread
。如果run()
您希望新线程调用myRun.f()
.
您还必须启动另一个Thread
(类型MyRun1
)并覆盖它的run
方法。
PS,不是扩展Thread
类,而是让您的类实现Runnable
接口并将它们的实例传递给Thread
构造函数是一种更好的做法。
推荐阅读
- r - 使用条件语句处理数据帧
- facebook-sdk-4.0 - 关于 Facebook Audience 网络原生广告模板高度
- ansible - 可以在角色变量文件中使用 Jinja2 表达式
- node.js - 从节点 js 执行 Powershell 脚本失败
- wordpress - 加载 RSS URL /feed/ 时 URL 的内容类型自动从 text/html 更改为 application/rss+xml
- kubernetes - 使用 kubernetes 部署 DB+Proxy+SSL
- javascript - Css - 不能改变这个属性
? - node.js - 订阅不适用于 Apollo Server Express
- django - 我正在尝试使用 gcs 谷歌云存储在 heroku 上部署我的 django 应用程序
- python - 如何使用 matplotlib 反转函数的轴