1.锁池
当所有需要竞争同步锁的线程都会放在锁池中,比如当前对象的锁已经被其中一个线程得到,则其他线程需要在这个锁池中进行等待,当前面的线程释放同步锁后锁池中的线程去竞争同步锁,当某个线程得到后会进行就绪对烈烈进行等待cpu资源分配。
2.等待池
当我们调用wait()方法后,线程会放到等待池中,等待池的线程是不会去竞争同步锁。只有调用了notify()或者notifyAll()后等待池的线程才会去竞争锁,notify()是随机从等待池中选出一个线程放到锁池,而notifyAll()是将等待池中所有线程放到锁池当中。
1.sleep是Thread类的静态本地方法,wait则是object类的本地方法。
2.sleep不会释放锁,wait会释放锁,而且会放到等待池中。
3.sleep方法不依赖同步器synchronized,但是wait需要依赖synchronized。
4.sleep不需要被唤醒(休眠结束后退出阻塞),但是wait需要
5.sleep一般用户当前线程休眠,或者轮询暂停操作,wait则多用于线程间通信
6.sleep会让出CPU执行时间且强制上下文切换,而wait不一定,wait后可能还是有机会重新竞争到锁继续执行。
yield()方法执行后线程直接进入就绪状态,马上释放了cpu的执行权,但是依然保留cpu的执行资格,所有有可能cpu下次进行线程调度还会让这个线程获取到执行权继续执行。
join()执行后线程进入阻塞状态,例如在线程B中调用线程A的join(),那么线程B会进入阻塞队列,知道线程A结束或中断线程。