Java多執行緒摘要 物件及變數的併發訪問

2021-08-18 20:00:44 字數 1622 閱讀 2560

1:」非執行緒安全」問題在於」例項變數」中,如果是方法內部的私有變數,則不存在」非執行緒安全」問題.

2:關鍵字synchronized取得的都是物件鎖,而不是把一段**或方法(函式)當做鎖, 所以哪個執行緒先執行synchronized關鍵字的方法,哪個執行緒就持有該方法所屬物件的鎖lock,那麼其他執行緒只能呈等待狀態,前提是多個執行緒訪問的是同乙個物件.

(注:如果多個執行緒訪問多個物件,則jvm會建立多個鎖)==(1)synchronized同步方法

1)對其他synchronized同步方法或synchronized(this)**塊呼叫呈阻塞狀態

2)同一時間只有乙個執行緒可以執行synchronized同步方法中的**

(2)synchronized(this)同步**塊

1)對其他synchronized同步方法或synchronized(this)**塊呼叫呈阻塞狀態

2)同一時間只有乙個執行緒可以執行synchronized(this)同步**塊中的**1)在多個執行緒持有」物件監視器」為同乙個物件的前提下,同一時間只有乙個執行緒可以執行synchronized(非this物件x)同步**塊中的**

2)當持有」物件監視器」為同乙個物件的前提下,同一時間只有乙個執行緒可以執行synchronized(非this物件x)同步**塊中的**1)當多個執行緒同時執行synchronized(x){}同步**塊時呈現同步效果.

2)當其他執行緒執行x物件中synchronized同步方法時呈現同步效果.

3)當其他執行緒執行x物件方法裡面synchronized(this)**塊時也呈現同步效果.

14:synchronized關鍵字加到static靜態方法上是給class類上鎖,而synchronized關鍵字加到非static靜態方法上是給物件加鎖

15:非同步的原因是持有不同的鎖,乙個是物件鎖,乙個是class鎖,而class鎖可以對類的所有物件實類起作用,同步synchronized(class)**塊的作用其實和synchronized static方法的作用是一樣的

16:將synchronized(string)同步塊與string 聯合使用時,要注意常量池以帶來的一些例外.,因此在大多數的情況下,同步synchronized**塊都不使用string作為鎖物件,而改用其他.比如new object() 例項化乙個object物件,但它並不放入快取中.

17:只要物件不變,即使物件的屬性被改變,執行的結果還是同步的.

18:關鍵字volatile的主要作用是使變數在多個執行緒間可見

19:關鍵字volatile的作用是強制從公共堆疊中取變數的值,而不是從執行緒私有資料棧中取得變數的值

20:關鍵字與synchronized進行比較:

1)關鍵字volatile是執行緒同步的輕量級實現,所以volatile效能肯定比synchronized要好,volatile只能修飾於變數,而synchronized可以修飾方法,以及**塊

2)多執行緒訪問volatile不會發生阻塞,而synchronized會出現阻塞

3)volatile能保證資料的可見性,但不能保證原子性;而synchronized可以保證原子性,也可以間接保證可見性,因為它會將私有記憶體和公共記憶體中的資料同步.

4)關鍵字volatile解決的是變數在多個執行緒之間的可見性;而synchronized關鍵字解決的是多執行緒之間訪問資源的同步性

Java多執行緒 鎖物件

前面總結了多個執行緒訪問同乙個物件的同步方法以同步執行,多個執行緒訪問多個物件的同步方法則以非同步方式執行,那如果多個執行緒分別訪問乙個物件中同步方法和非同步方法會如何執行那?demo myobject類 包含了乙個同步方法和乙個非同步方法 public class myobject catch i...

Java多執行緒及執行緒池

提問 我開啟了乙個qq 又開啟了乙個遊戲,請問我開啟了兩個執行緒嗎?回答 概念理解錯誤,你其實開啟是兩個程序,為什麼呢,請看概念 程序是正在執行的程式,是系統呼叫資源和進行資源分配的基本單位。比如所說的qq 和乙個遊戲,這就是兩個正在執行的程式。我們的作業系統都是多程序的。繼續提問 早期的計算機是單...

Java多執行緒 變數共享分析

在編寫多執行緒程式時,最重要的就是搞清楚哪些變數是共享的,哪些變數是不共享的。也就是要分析清楚其中的原理呀。因為最近要使用多執行緒就看了一些,對使用thread類的子類建立執行緒的情況,總結如下 1.方法體內部定義的區域性變數不共享 這是因為方法內部定義的變數是在執行時動態生成的。每個執行緒都有乙個...