《java多線程編程核心技術》讀書筆記2.1__編程

來源:互聯網
上載者:User

第二章 對象及變數的並發訪問


本節主要總結了一些synchronized的使用方法:

在java中:“非安全執行緒”的問題存在於“執行個體變數”中,如果是方法內部的私人變數,則不存在“非安全執行緒“的問題。


synchronized加在方法的前部:

       synchronized取得的鎖都是對象鎖,而不是把一段代碼或方法當作鎖,線上程的執行過程當中,哪個線程先執行了帶synchronized關鍵字的方法,哪個線程就持有該方法所屬對象的鎖,那麼其他線程只能等待,前提是多個線程訪問的是同一個對象的synchronized方法。如果多個線程訪問多個對象,則JVM會建立多個鎖。

     如果一個線程已經持有了一個對象的鎖,另外一個線程則不能訪問該對象的同步方法,但是可以訪問該對象的非同步方法。


    同步不具有繼承性,如果父類的某個方法擁有synchronized關鍵字,子類的該方法若想同步必須手動的加入synchronized關鍵字;


synchronized同步代碼塊synchronized(this):一個線程如果訪問了同步代碼塊中的代碼,另一個線程不可以訪問該對象的任何同步代碼塊,但可以訪問非同步代碼塊。同步代碼塊鎖定的也是當前對象。


將任意對象作為監視器:synchronized(非this對象)

在多線程持有對像監視器為同一個對象的前提下,同一時間只有一個線程可以執行synchronized(非this對象)中的同步代碼塊

當持有對象監視器為同一個對象的前提下,同一時間只有一個線程可以執行synchronized(非this對象)同步代碼塊中的代碼。



三個結論:

當多個線程同時執行synchronized(x){}同步代碼塊時程同步效果。

當其他線程執行x對象中的synchronized同步方法時呈同步效果。

當其他線程執行x對象方法裡面的synchronized(this)代碼時呈同步效果

如果其他線程調用不加synchronized關鍵字方法時,還是非同步呼叫。


靜態同步:有兩種一種在靜態方法前面加上synchronized關鍵字,一種是synchronize(class)

關鍵字加到static方法上是給Class上鎖,加到非static是給對象上鎖。


class鎖可以對類的所有執行個體起作用,即就是在任何時候,只能有一個線程訪問該類的static方法。因為static方法就是類方法。




關於鎖是字串的情況:

     由於java中String常量池的存在,在程式中str1 = "AA",與str1 = "AA"實際是指向一個形同的對象,所以在應用鎖的時候synchronized(str1)與synchronized(str2)請求的是同一個鎖。因此在大多數情況下,同步synchronized代碼塊都不使用String作為鎖對象。改用其他的。


為了避免線程的長時間等待,應儘可能的使用synchronized同步代碼塊,少用synchronized方法。


在任何資料類型作為同步鎖時,需要注意的是,是否有多個線程同時持有鎖對象,如果同時持有相同的鎖對象,則這些線程之間是同步的,如過分別獲得鎖對象,則這些線程之間是非同步的。















聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.