synchronized 解决了多线程竞争的问题: 我们可以 在 synchronized块中安全的对一个变量进行修改
class TaskQueue{ Queuequeue= new LinkedList<>(); public synchronized void addTask(String s){ this .queue.add(s) }}
没有解决多线程协调的问题
class TaskQueue{ //队列 Queuequeue= new LinkedList<>(); public synchronized void addTask(String s){ this .queue.add(s) } public synchronized String getTask(){ while(queue.isEmpty()){ } return queue.remove(); }}
多线程协调运行: 但条件不满足时,线程进入等待状态
public synchronized String getTask(){ //1.线程1 获取锁 while(queue.isEmpty()){ // 线程 1 判断条件 this.wait(); //线程 1 进入等待状态 } return queue.remove(); }
线程协调机制: wait /notify
class TaskQueue{ //队列 Queuequeue= new LinkedList<>(); public synchronized void addTask(String s){ this .queue.add(s) this.notify(); } public synchronized String getTask(){ while(queue.isEmpty()){ } return queue.remove(); }}
wait /notiy 用于多线程协调运行:
- 在synchronized内部可以调用wait()是线程进入等待状态
- 必须在已获得的锁对象调用wait()方法
- 在synchronized内部可以调用notify/notiyAll()唤醒其他等待线程
- 必须在获得的锁对象调用notify/notifyAll()方法