Thread.sleep();
sleep就是正在執行的線程主動讓出cpu,cpu去執行其他線程,在sleep指定的時間過后,cpu才會回到這個線程上繼續往下執行,如果當前線程進入了同步鎖,sleep方法并不會釋放鎖,即使當前線程使用sleep方法讓出了cpu,但其他被同步鎖擋住了的線程也無法得到執行。
在多線程爭用的情況,擁有鎖的線程進行一些耗時操作,會極大降低吞吐量(amdahl定律),如果在同步塊中使用sleep就是一種糟糕的做法,它不會釋放鎖卻阻止其他線程獲得鎖。
2. Thread.yield();
yeild是個native靜態方法,這個方法是想把自己占有的cpu時間釋放掉,然后和其他線程一起競爭(注意yeild的線程還是有可能爭奪到cpu,注意與sleep區別)。在javadoc中也說明了,yeild是個基本不會用到的方法,一般在debug和test中使用。
3. Object.wait();
wait會把當前的鎖釋放掉同時阻塞住,讓出CPU;當別的線程調用該 Object 的 notify/notifyAll 之后,有可能得到 CPU,同時重新獲得鎖。
當然同樣的condition.await();
也會釋放鎖并且讓出CPU;
當然很多競爭鎖失敗的線程最終也會阻塞住,但是這不是主動讓出CPU,不在討論范圍內。
4. Thread.stop();
太過暴力,不推薦使用,同時會釋放所有鎖。容易導致數據不一致,具體請查看[高并發Java 二] 多線程基礎
5. Thread.currentThread().suspend();
掛起線程,suspend不會釋放鎖,suspend容易發生死鎖,不推薦使用。原因請查看[高并發Java 二] 多線程基礎
6. LockSupport.park();
與suspend一樣掛起線程,但是park/unpark不會發生死鎖,原因請查看[高并發Java 五] JDK并發包1