synchronized 解决了多线程竞争的问题: 我们可以 在 synchronized块中安全的对一个变量进行修改
class TaskQueue{
Queue<String> queue= new LinkedList<>();
public synchronized void addTask(String s){
this .queue.add(s)
}
}
没有解决多线程协调的问题
class TaskQueue{
//队列
Queue<String> queue= 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{
//队列
Queue<String> queue= 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 用于多线程协调运行:
1、 在synchronized内部可以调用wait()是线程进入等待状态
2、 必须在已获得的锁对象调用wait()方法
3、 在synchronized内部可以调用notify/notiyAll()唤醒其他等待线程
4、 必须在获得的锁对象调用notify/notifyAll()方法