1.wait可以指定时间也可以不指定,sleep必须指定时间。
2.在同步是,对cpu的执行权和锁的处理不同(知识点:执行权,有执行权,那么意味了一直占用cpu在执行,其它线程分配不到cpu)
wait:释放执行权,释放锁(很好理解,不指定时间,那么他必须要等别人唤醒,如果不释放锁和执行权,那么其他线程压根没法执行)。
sleep:释放执行权,不释放锁(到了时间自己醒来继续执行)
/**
* 创建日期:2019-6-4下午12:07:57
* 修改日期:
* 作者:laishi
* 版本: 1.0.0
* 功能说明:
*/
package com.lsx.面试题;
/**
* 创建日期:2019-6-4下午12:07:57 修改日期: 作者:laishixiong 版本: 1.0.0 功能说明:
*/
public class 问题2 {
public void show() {//t1 t2 t3
synchronized (this) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void method() {//t4
synchronized (this) {
notifyAll();
}
}
}
//1. 问题说明:假设t1,t2,t3同时执行代码show(),这个时候假设t1第一个拿到锁
//2. t1遇到wait就会释放执行权和锁,这个时候t2,t3的流程是一样的,全部执行了一遍wait,然后全部处于等待状态。这个时候出现了现象就是三个线程都进入了同步代码块。
//理论定义了只能一个线程执行同步代码块。一把锁同一时刻只能被一个对象拥有。
//3. t4执行method()方法调用notifyAll(),这个时候t1,t2,t3将被同事唤醒,这个时候就会出现这个问题,三个线程全部被唤醒,wait之后的代码怎么执行
//4. 按照谁第一个wait的线程,进行锁的分配,所以t1会先获得锁,然后执行代码,执行完了之后再把锁给下一个线程