Object
- java中所有的类都会隐式的继承Object,但是Object的wait,notify,notifyAll我们又真的会用吗
synchronized
synchronized是用来保证我们的一段代码在执行的过程中不会被中断而引起并发问题,synchronized可以修饰一个函数,某一段代码而wait()
函数就应该在synchronized代码块中执行
synchronized使用场景
当我们有多个线程同时开启,但是在某一个特定时刻
只有一个线程在真正的执行,当我们需要一段代码执行完而不被中断那么我们那就应该使用synchronized
包裹这一段代码,那么这段代码就是持有了锁,下面我们引入两个概念
- 锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。
- 等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池中
概念来源:Java中的锁池和等待池
wait(),notify(),notifyAll()
wait()
使当前代码块进去等待池notify()
让等待池中随机一个线程进行锁池,这个线程将有竞争锁的资格(这时候就有两个线程具有竞争资格调用notify()的线程和被notify()唤醒的线程
)notifyAll()
使所有线程进入锁池,都具有竞争锁的资格(所有线程都具有竞争资格
)