線程小知識

一、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)

相關文章
相關標籤/搜索