如果我写了以下课程:
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的方法会被同步,在哪种情况下它会停止同步?
答案 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
}
}