目录
一、notify与notifyAll的区别
锁池:
假设线程A已经拥有对象锁,线程B、C想要获取锁就会被阻塞,进入一个地方去等待锁,这个地方就是该对象的锁池;
等待池:
假设线程A调用某个对象的wait方法,线程A就会释放该对象锁,同时线程A进入该对象的等待池中,进入等待池中的线程不会去竞争该对象的锁。
1、notify只会随机选取一个处于等待池中的线程进入锁池去竞争获取锁的机会;
2、notifyAll会让所有处于等待池的线程全部进入锁池去竞争获取锁的机会;
二、sleep与wait的区别
sleep
- sleep是静态方法
- 属于Thread类,作用于当前线程
- 不释放锁资源
- 可通过调用interrupt()方法来唤醒休眠线程
- 不需要在同步方法和同步块中调用
wait
- wait()是实例方法
- 属于Object类,作用于当前对象
- 调用时,会释放已经获取的锁资源
- 当别的其他线程调用notify()或者notifyAll()方法时,当前线程进入就绪状态
- 必须在同步上下文中调用