锁
syschronized
Lock(接口)
它的实现类如下:
ReentrantLock为可重入锁,还有ReadLock读锁和WriteLock写锁
new ReentrantLock(); 时,构造函数为如下,有两种锁,分别为:
- 公平锁 :需要排队,先来先执行
- 非公平锁 :不需要排队,可以插队,由cpu来进行调度(默认)
Synchronized 和 Lock 区别
wait和notify、notifyAll中的虚假唤醒:
当一个条件满足时,很多线程都被唤醒了,但是只有其中部分是有用的唤醒,其它的唤醒都是无用功
1.比如说买货,如果商品本来没有货物,突然进了一件商品,这是所有的线程都被唤醒了,但是只能一个人买,所以其他人都是假唤醒,获取不到对象的锁
问题原因和解决办法:
while (条件) {} 不会出现虚假唤醒
if (条件) {} 会出现虚假唤醒
因为:
因为if只会执行一次,执行完会接着向下执行if()外边的
而while不会,直到条件满足才会向下执行while()外边的