在synchronized方法中使用wait()和notify()

时间:2014-06-30 10:05:58

标签: java multithreading synchronization synchronized

如果我写了以下课程:

public class Thread1 extends thread{
  int num;
  OtherObject obj;
  boolean isFinished;
  public Thread1(int num, OtherObject obj){
    this.num = num;
    this.obj = obj;
    isFinished = false;
  }

  public void run(){
    this.startMethod();
  }

  public synchronize void startMethod(){
    obj.anotherMethod()
    if(isFinished !=true)
      wait();
    isFinished = true;
    notifyAll();
  }

public class main{
  public static void main (String[] args){
    OtherObject other = new OtherObject();
    Thread1 first = new Thread1(1, other);
    Thread1 second = new Thread1(2, other);
    first.start();
    second.start();

*此代码没有逻辑含义,但代表了synchronized,wait(),notify()的想法。

1)同步方法何时运行同步。 "第一"和"第二"是不同的对象,他们会同步吗?或不? 或者因为他们有共享变量 - OtherObject obj他们将被同步?

2)当我写wait()时,可以说线程"首先"物体会在睡觉时醒来并醒来吗?

只有来自同一个类的另一个对象已经完成了notify()? 或者当程序中的任何对象调用notify()时? 如果我在" OtherObject"它也会使#34;第一"对象醒来?

3)" startMethod"同步,因为它,当我启动()第一个和第二个线程然后他们执行run方法并启动" startMethod"。

" startMethod"将是同步还是不同步?也许是因为它进入了另一种方法" (这不是同步方法)里面或因为它是从" run"那也不同步? 我不明白什么时候标记为synchronized的方法会被同步,在哪种情况下它会停止同步?

1 个答案:

答案 0 :(得分:1)

3)该方法是同步的,但只对该对象实例,两个线程将运行它而不会相互阻塞,因为它们是2个独立的实例。

2)如果线程使用wait(你必须先锁定),它会进入等待模式,只有在 相同 锁定的另一个线程时才会再次启动使用notify / nofityAll。如果具有 不同 锁定的线程调用notify,则该特定线程不会发生任何事情。

侧节点:notify告诉单个线程继续,但是随机选择,所以很多人都喜欢使用notifyAll。

1)如果您希望能够在可共享变量上进行同步,那么您希望使用它:

var Object obj; //assign instance on constructor or something like that

void method(){
    synchronized(obj){
         //sync code for obj instance
    }
}