想要看懂这篇博客之前你得先知道synchronized具体的使用方法,可以看我之前的博客:java多线程(一):synchronized 对象锁和类锁的区别
首先介绍几个概念:
1.锁池
所有需要竞争同步锁的线程都会放在锁池当中,比如当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池进行等待,当前面的线程释放同步锁后锁池中的线程去竞争同步锁,当某个线程得到后会进入就绪队列进行等待cpu资源分配。
2.等待池
当我们调用wait()方法后,线程会放到等待池当中,等待池的线程是不会去竞争同步锁。只有调用了notify()或notifyAll()后等待池的线程才会开始去竞争锁,notify()是随机从等待池选出一个线程放到锁池,而notifyAll()是将等待池的所有线程放到锁池当中
二、 wait()、sleep()、 join()和yield()区别
1、wait()
1.wait()必须在synchronized 修饰的同步代码块中调用
2.wait()会释放cpu资源和释放同步锁(类锁和对象锁)
3.调用wait()后必须调用notify()或notifyAll()后线程才会从等待池进入到锁池,当我们的线程竞争得到同步锁后就会重新进入绪状态等待cpu资源分配
4.wait()是Object类的方法
2、sleep()
1.sleep()会释放cpu资源,但是不会释放同步锁(类锁和对象锁)
2.sleep()是Thread类的方法
3.sleep()调用后线程会进入阻塞队列,时间到之后线程会进入就绪队列,重新去竞争cpu资源,而wait()方法不会。
3.yield()
yield&