一、yieldhtml
Thread.yield(),是將線程從執行狀態(運行狀態)變爲可執行狀態(就緒狀態),cpu會從衆多可執行狀態線程選擇,也就是說線程執行yield方法也可能會再次執行。安全
若是以爲一個線程不是那麼重要,或者優先級很是低,並且又懼怕它會佔用太多的CPU資源,那麼能夠在適當的時候調用Thread.yield(),給予其餘重要線程更多的工做機會。ide
二、volatile優化
volatile解決線程的可見性、有序性。線程
1、可見性htm
共享變量存放在主內存中,假若有兩個線程要去使用到這個共享變量,那麼這兩個線程會將共享變量讀取到本身的工做內存中去,假如一個線程修改了共享變量值而沒有及時刷新到主內存,另一個線程工做內存中的變量值就不是最新的,當這個線程對變量進行操做時就可能會出現線程安全問題。blog
使用volatile修飾變量時排序
當寫一個 volatile 變量時,JMM 會把該線程對應的本地內存中的共享變量值刷新到主內存。內存
當讀一個 volatile 變量時,JMM 會把該線程對應的本地內存置爲無效。線程接下來將從主內存中讀取共享變量。資源
2、有序性
重排序,虛擬機在代碼運行時會有優化策略,好比int a=1,int b =2,不管虛擬器先讀取那個值,都不影響他們最終狀態,這時虛擬機有可能進行重排序。
重排序雖然對變量的值沒有形成影響,但有可能會出現線程安全問題的。(https://www.cnblogs.com/kubidemanong/p/9505944.html)