sleep和wait的区别,sleep会不会释放锁,notify和notifyAll的区别

sleep和wait

wait是Object的方法,wait是Thread的静态方法。

wait会释放锁,sleep不会。

notify和notifyAll

通过wait使得线程挂起等待某个条件满足,当其他线程得运行使得这个条件满足时,就可以调用notify或者notifyAll来唤醒这个进程。他们都属于Object的方法。只能在同步块或者同步方法中调用,否则会抛出illegalMonitorException。

当调用wait方法后,线程会进入拥有锁的对象的等待池中。等待池中的对象不会竞争该对象的锁。

当调用notify方法,便会有一个进程从等待池进入该对象的锁池,锁池中的对象可以竞争该对象的锁。而notifyAll会唤醒所有等待池中的线程进入锁池。

优先级高的线程拥有更大的概率通过竞争得到对象的锁,得到锁后该线程会继续执行,直到执行完synchronized的代码块,便会释放锁。没有竞争到锁的进程会留在锁池中,直到该线程重新调用wait方法它才会进入等待池。当锁被释放后,锁池中的线程会重新竞争。

锁池和等待池

等待池:线程A调用B对象的wait方法,它便会进入B的等待池中。

锁池:线程A已经拥有了对象B的锁,此时线程C想要调用B的synchronized方法(或代码块),就会进入B的锁池。

你可能感兴趣的:(JAVA笔记)