多線程之併發訪問

    1. 「非線程安全」問題存在於"實例變量"中,方法內的變量爲線程安全。java

    2.   關鍵字synchronized 取得的鎖都是對象鎖。安全

    3.   若是多個線程訪問多個對象,則JVM會建立多個鎖。多線程

    4.    A線程先持有object對象的Lock鎖,B線程能夠異步的方式調用object對象中的非synchronized類型的方法。異步

    5.     A線程先持有object對象的Lock鎖,B線程若是在這時候調用object對象中的synchronized類型的方法,則須要同步。性能

    6.    synchronized鎖重入:在使用synchronized時,當一個線程獲得一個對象鎖後,再次請求此對象鎖時是能夠再次獲得該對象的鎖的。這也說明,在一個synchronized方法\塊的內部調用本類的其餘synchronized方法\塊時,是永遠能夠獲得鎖的。this

    7.    可重入鎖也支持在父子類繼承的環境中。spa

    8.    當存在父子類繼承關係時,子類是徹底能夠經過"可重入鎖"調用父類的同步方法的。.net

    9.    當出現異常時,鎖自動釋放。線程

    10.    同步不具備繼承性。對象

    11.    synchronized同步語句塊:synchronized 同步方法在某些狀況下有弊端,在這種狀況下,可使用synchronized同步語句塊來解決。

    12.     synchronized(this) 使用的"對象監視器"是一個。

    13.    synchronized還能夠用在static靜態方法上,那是對*.java對應的Class類進行加鎖。

    14.    String 常量池

    15.    synchronized代碼塊一般狀況下不適用String做爲鎖對象,由於String常量池帶來的問題。

    16.    volatile:主要做用是使變量在多個線程間可見。它強制從公共堆棧中取得變量的值,而不是從線程私有數據棧中取得變量的值。

    17.    volatile變量不支持原子性。

    18.     synchronized vs volatile

  • volatile是線程同步的輕量級實現,因此性能優於synchronized,而且volatile只能適用於修飾變量,而synchronized能夠修飾方法,代碼塊。
  • 多線程訪問volatile不會發生阻塞,而synchronized會發生阻塞。
  • volatile能保證數據的可見性,但不能保證原子性;synchronized能夠保證原子性,也能夠間接保證可見性,由於它會將私有內存和公共內存中的數據作同步。
  • volatile解決的是變量在多個線程中的可見性,而synchronized解決的是多線程之間資源的同步性。

    19.    變量在內存中工做過程:

    

        read和load階段:從主存複製變量到當前線程工做內存;

        use和asign階段:執行代碼,改變共享變量值;

        store和write階段:用工做內存數據刷新主對應變量的值;

    20.    AtomicInteger, AtomicLong   原子類。可是原子類在具備邏輯的狀況下輸出結果也具備隨機性。

    21.    synchronized 代碼塊具備volatile同步的功能,synchronized可使具備可視性

相關文章
相關標籤/搜索