Java:在本例中防止死锁

Java:在本例中防止死锁,java,multithreading,concurrency,synchronization,Java,Multithreading,Concurrency,Synchronization,为了练习我对Java并发性的理解,问题是: 可以有多个线程运行方法A,只有一个线程运行方法B,比如说当A运行了10次。因此,在第10次,该线程将运行方法B。当这种情况发生时,它必须阻止线程运行A,并允许已经运行A的线程在运行B的其余部分之前完成。此外,A中的线程不应自行等待 编辑:所有线程都在第一个线程上启动,有一个外部方法检查何时运行B 到目前为止,我的尝试如下所示: volatile Boolean lock = false; //false = threads in method A al

为了练习我对Java并发性的理解,问题是: 可以有多个线程运行方法A,只有一个线程运行方法B,比如说当A运行了10次。因此,在第10次,该线程将运行方法B。当这种情况发生时,它必须阻止线程运行A,并允许已经运行A的线程在运行B的其余部分之前完成。此外,A中的线程不应自行等待

编辑:所有线程都在第一个线程上启动,有一个外部方法检查何时运行B

到目前为止,我的尝试如下所示:

volatile Boolean lock = false; //false = threads in method A allowed to run, thread in method B otherwise
volatile Integer countOfA = 0;

void A(){
    boolean continue = false;
    synchronized(lock){
    if(lock == true){ //there is a thread in B, block threads in A
        lock.wait();

        increaseCountOfA();
        //do work
        decreaseCountOfA();

        if(countOfA == 0){ //this was the last thread that ran with lock
            lock = true;
            lock.notify(); //only the thread in B should be waiting on this
        }
      }else{
        continue = true;
      }
    }

    if(continue){
        increaseCountOfA();
        //do work;
        decreaseCountOfA();
    }
}

void B(){
  synchronized(lock){
    if(lock == false){
        lock.wait();
        if(countOfA > 0){
            countOfA.wait();
        }
        //do work;
        lock = false;
        lock.notifyAll();
    }
  }
}

void increaseCountOfA(){
  synchronized(countOfA){
    countOfA++;
  }
}

void decreaseCountOfA(){
  synchronized(countOfA){
    countOfA--;
  }
}
当它运行时,它挂起。我怀疑是死锁,我也不知道这个问题需要多少级别的同步。这可以用一个级别来完成吗

执行synchronizedlock时,您是在lock引用的对象上同步,而不是在变量上同步。您可能需要一个独立的锁对象,其值不会更改。或者,您可以考虑使用更高级的并发类,例如信号量。
在这种情况下,一个线程在等待Boolean.TRUE,另一个线程在Boolean.FALSE上发布通知。

如果我错了,请纠正我,但我不认为这段代码会将VARABLE“lock”设置为TRUE,所以可能所有线程都在等待它。是的,你是对的。已将其初始化为true,但其行为仍保持不变。@Belov实际上,lock一开始应该为false,以允许线程在A first中工作,请注意A中的其他线程。我知道init为false,sup为true,但我认为您应该将其更改为true,我猜是在B方法中的某个地方。目前,您只在iflock==true语句中放入lock=true,并且由于lock是init到false,所以它不会更改。如果lock有一个常量对象,不会使线程在一个循环中按顺序执行,因为它们都在该循环中同步吗?这些同步块一开始可能不会太大。所有线程A都会等待锁。由于wait释放了监视器,所以只要一个线程等待,其他线程就可以自由地进入同步块。然后notify永远不会被调用,因为所有线程A都被阻塞了,而线程B只在lock为false时调用notify。