首页 > 解决方案 > 为什么同步功能不阻止进入?(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

标签: java

解决方案


您的所有代码都在主线程上运行,因为您没有启动任何其他线程。因此,您的方法是否无关紧要synchronized,因为执行是顺序的。

你必须打电话myRun.start()才能开始Thread。如果run()您希望新线程调用myRun.f().

您还必须启动另一个Thread(类型MyRun1)并覆盖它的run方法。

PS,不是扩展Thread类,而是让您的类实现Runnable接口并将它们的实例传递给Thread构造函数是一种更好的做法。


推荐阅读