繁体   English   中英

为什么同步功能不会阻止进入? (JAVA)

[英]Why synchronized function does not prevent entry? (JAVA)

我有2个我想与他们建立僵局的类。 我试图创建两个相互读取的同步函数-因此该过程将卡住。 但是,函数不会继续卡住,而是继续互相调用。 我不明白为什么会发生这种情况,一旦同一功能中存在另一个进程,则synced关键字应阻止该进程进入该函数。


MyRun:

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;
}
}

MyRun2:

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 如果要新线程调用myRun.f()则必须重写run()方法。

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

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

Java同步是可重入的。

如果线程正在执行一个同步块,并且该块内的代码直接或间接调用试图在同一对象上进行同步的代码,则该线程不会被阻塞。

蒸馏下来:

synchronized (myRun) {
  synchronized (myRun1) {
    synchronized (myRun) {
      System.out.println("Hello");
    }
  }
}

在这里,将打印Hello ,因为myRun已经同步的事实并不会阻止与之同步的内部块。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM