Java多線程系列之三 ------------ synchronized 全面解析

    爲什麼要使用synchronized 關鍵字,這個有什麼用?

          在多線程中,首先得存在共享數據(也稱臨界資源),其次還得存在多條線程共同操作共享數據。存在多個線程操作共享數據時,需要保證同一時刻有且只有一個線程在操作共享數據,其他線程必須等到該線程處理完數據後再進行,這種方式有個的名稱叫互斥鎖,獨佔鎖/排它鎖都是這個意思,這樣主要就是保證數據的安全性問題。

          在 Java 中,關鍵字 synchronized可以保證在同一個時刻,只有一個線程可以執行某個方法或者某個代碼塊(主要是對方法或者代碼塊中存在共享數據的操作),synchronized可保證一個線程的變化(主要是共享數據的變化)被其他線程所看到(保證可見性,完全可以替代volatile功能)。

     多線程的三個特性:原子性,可見性,有序性

 原子性:即一個操作或者多個操作 要麼全部執行並且執行的過程不會被任何因素打斷,要麼就都不執行。                                     可見性:是指當一個線程修改了某一個共享變量的值,其他線程是否能夠立即知道這個修改。顯然,對於串行來說是不存在的。     有序性:在併發時,程序的執行可能會出現亂序。給人的直觀感覺就是:寫在前面的代碼,會在後面執行。有序性問題的原因是因爲程序在執行時,可能會進行指令重排,重排後的指令與原指令的順序未必一致。

      synchronized  和  volatile   

synchronized關鍵字,它會阻止其它線程獲取當前對象的監控鎖,這樣就使得當前對象中被synchronized關鍵字保護的代碼塊無法被其它線程訪問,也就無法併發執行。更重要的是,synchronized還會創建一個內存屏障,內存屏障指令保證了所有CPU操作結果都會直接刷到主存中,從而保證了操作的內存可見性,同時也使得先獲得這個鎖的線程的所有操作,都happens-before於隨後獲得這個鎖的線程的操作。

  • volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取; synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。
  • volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的
  • volatile僅能實現變量的修改可見性,不能保證原子性;而synchronized則可以保證變量的修改可見性和原子性
  • volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。

下文博客之後接着寫

 

 

 

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章