首先本篇文章要说的是:wait方法会释放当前锁对象,但是notify不会释放锁,可能你并未理解什么意思,上代码:
public class MyThread6 {
private volatile List list = new ArrayList<>();
public void add() {
list.add("主席");
}
public int getSize() {
return list.size();
}
public static void main(String[] args) {
MyThread6 myThread6 = new MyThread6();
Object obj = new Object();
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj) {
for(int i=0;i<10;i++){
myThread6.add();
System.out.println("线程" + Thread.currentThread().getName() + "添加了一个元素");
try {
Thread.sleep(1000);
if (myThread6.getSize() == 5) {
System.out.println("发出通知");
obj.notifyAll();
}
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
},"t1");
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj) {
if(myThread6.getSize()!=5){
try {
obj.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("收到通知");
throw new RuntimeException();
}
}
});
thread2.start();
thread.start();
}
}
输出结果:
线程t1添加了一个元素
线程t1添加了一个元素
线程t1添加了一个元素
线程t1添加了一个元素
线程t1添加了一个元素
发出通知
线程t1添加了一个元素
线程t1添加了一个元素
线程t1添加了一个元素
线程t1添加了一个元素
线程t1添加了一个元素
收到通知
Exception in thread "Thread-0" java.lang.RuntimeException
at cn.lh.bf.MyThread6$2.run(MyThread6.java:61)
at java.lang.Thread.run(Thread.java:745)
可以看见,虽然发送通知了(notify方法运行),但是当前锁并未释放,而是只要线程t1运行结束释放锁之后线程2才收到通知,抛出异常。