作用

  • wait:让线程处于等待状态,并释放锁
  • notify:唤醒处于等待状态的线程。
  • notify:唤醒等待在该锁下的所有线程。

为什么要加synchronized

锁是什么?为什么需要锁?要从操作系统角度去理解,而不是囿于java语言。其实很多概念都是这样,其实是操作系统层面的概念,体现在java上,而不是java特有的概念,比如:jmm、并发、线程、锁等等。
回到问题,为什么需要锁,因为有并发,所以需要锁,锁是解决并发的最常用的一种方式,当然还有其他方式,破坏竞态条件即可。锁说到底是一种状态,如何实现这种状态的存储和获取是各种系统需要考虑的,在java中,就提供了synchronized这么一个产品,底层通过monitorenter和monitorexit实现entry_set和wait_set。同理在分布式系统中,通过redis、zookeeper甚至mysql实现状态的存储。也就是分布式锁。
如何进行锁状态的存储?java世界中对象是最普遍也是最常见的,所以将锁状态存储在对象中,也就是对象模型的header中的markword中。
线程为什么要等待和唤醒?当然唤醒是因为等待了,所以问题就简化为线程为什么要等待?相信对任何一个系统来说,线程执行完成的越快越好,为什么要等待?显然是不得不等待,什么情况要等待?并发和IO,IO

为什么不在Thread类中

IO状态、sleep、wait三种场景下线程有什么区别?

首先要了解线程所有状态:就绪、运行、阻塞、结束,不考虑结束和就绪两个非长时间状态的话,就至于运行和阻塞。
那么运行和阻塞有什么区别?运行占用cpu、阻塞不占用cpu就是最大的区别。
synchron
wait:阻塞状态(WAITING状态),释放cpu执行权,释放锁。wait在被notify唤醒之后还是会继续和其他阻塞在synchronied上面线程进行锁竞争。也就是从wait_list放到entry_list中去,也就是从WAITING状态变为BLOCKED状态
sleep:阻塞状态(TIMED_WAITING状态),释放cpu执行权,不释放锁。
IO:阻塞状态,释放cpu执行权,不释放锁。
join:底层基于wait实现阻塞。

wait被唤醒之后会发生

各个阻塞的状态有什么不同?
sleep:阻塞状态(TIMED_WAITING状态),释放cpu执行权,不释放锁。
wait:阻塞状态(WAITING状态),释放cpu执行权,释放锁。wait在被notify唤醒之后还是会继续和其他阻塞在