public class ThreadTest {
public static int counter = 0;
public static Integer lock = 0;;
public static void main(String ... arg){
Thread t1 = new Thread(){
public void run(){
for(int i=0;i<10;i++){
synchronized (lock) {
lock.notify();
try {
System.out.println("thread" + Thread.currentThread().getId() + " print " + i);
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
Thread t2 = new Thread(){
public void run(){
for(int i=0;i<10;i++){
synchronized (lock) {
lock.notify();
try {
System.out.println("thread" + Thread.currentThread().getId() + " print " + i);
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
};
t1.start();
t2.start();
}
}
你在lock对象上面上锁,但是你居然修改lock的值。
你的代码为报错原因是:
This method(notify/wait) should only be called by a thread that is the owner of this object's monitor.
hread t1 = new Thread(){
public void run(){
for(int i=0;i<10;i++){
synchronized (lock) {//获取lock=0的对象的监视器
try {
while(lock%2==0){
lock.wait();
}
System.out.println("1 "+lock);
lock+=1;//你居然修改了这个对象
} catch (InterruptedException e) {
e.printStackTrace();
}
lock.notify();//此时lock的值不为0了,但是该线程拥有的是lock=0的对象监视器,这个时候调用notify方法就报错了,因为notify必须使用线程拥有的监视器对应对象调用。
}
}
}
};