摘要:線程同步提供了兩種策略本文介紹不過,需要先了解一下同步機制的實現(xiàn),是圍繞被稱為的內部實例實現(xiàn)的。在獲取到釋放這之間,該線程擁有該。當試圖請求一個已經被獨占的時,其他線程將會阻塞。實現(xiàn)線程同步的另一種方法,就是使用。
線程同步 提供了兩種策略
Synchronized Methods
Synchronized Statements
本文介紹 Synchronized Statements
不過,需要先了解一下 Intrinsic Locks
Intrinsic Locks and Synchronization同步機制的實現(xiàn),是圍繞被稱為 intrinsic lock 的內部實例實現(xiàn)的。Intrinsic lock 在同步機制中發(fā)揮兩個作用:強制獨占訪問對象狀態(tài)的權限,并建立可見的 happens-before 關系
每一個對象都有一個 intrinsic lock 與之關聯(lián)。一般的,一個需要獨占某對象的訪問權限的線程,在訪問該對象的資源之前,需要請求這個對象的 intrinsic lock,并在訪問結束后釋放該 intrinsic lock 。在獲取 lock 到釋放 lock 這之間,該線程擁有該 intrinsic lock 。只要一個線程擁有 intrinsic lock,其他線程將不會獲取該 lock 。當試圖請求一個已經被獨占的 lock 時,其他線程將會阻塞 。
當一個線程釋放 intrinsic lock,該動作將會與隨后的獲取 lock 的請求之間,建立一個 happens-before 關系 —— 即隨后的被阻塞的線程,可以得知 lock 已被釋放。
Synchronized Methods 中的 Locks當一個線程調用一個對象的 synchronized method,該線程將自動獲取這個對象的 intrinsic lock,然后在方法 return 時釋放 lock 。即使 method 是因為沒有 catch 的 exception 而返回, 也會釋放 lock
BTW: 當調用一個 static synchronized method 時(即該方法與一個類關聯(lián),而不是一個對象),會發(fā)生什么?線程會向該類的 Class 對象請求 intrinsic lock。
Synchronized Statements實現(xiàn)線程同步的另一種方法,就是使用 Synchronized Statements。
與 Synchronized Methods 不同,Synchronized Statements 不能自動獲取對象的 intrinsic lock,而是必須明確指明提供了 intrinsic lock 的對象(這也是 Synchronized Statements 的優(yōu)點,稍后會提到)
例子:
public void addName(String name) { synchronized(this) { lastName = name; nameCount++; } nameList.add(name); }
上邊的例子中,不同線程調用 addName 方法在修改 lastName 和 nameCount 時,將會同步。在調用 nameList.add 方法時將不會進行同步。
再說一個例子。假定類 MyLunch 有兩個字段 c1 和 c2,且這兩個字段絕不會用在一起。所有對 c1 和 c2 的修改都必須分別同步,但沒必要再修改 c1 時避免對 c2 的修改,反而使得程序效率不高。
因此,不使用 Synchronized Methods 或 synchronized (this),而是獨立的創(chuàng)建兩個對象,提供各自獨立的 intrinsic lock
public class MsLunch { private long c1 = 0; private long c2 = 0; private Object lock1 = new Object(); private Object lock2 = new Object(); public void inc1() { synchronized(lock1) { c1++; } } public void inc2() { synchronized(lock2) { c2++; } } }Reentrant Synchronization
一個線程不能請求到一個已經被其它線程占用的 lock,但一個線程可以請求到一個已經被自己占中的 lock。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://systransis.cn/yun/65288.html
摘要:這保證了該對象的所有狀態(tài)的改變,對于所有線程是可見的為構造函數(shù)添加是語法錯誤。 Synchronized Methods 線程同步 提供了兩種策略 Synchronized Methods Synchronized Statements 本文介紹 Synchronized Methods 一個例子 使用 synchronized 關鍵字,使一個方法為 synchronized pu...
摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
閱讀 2240·2023-04-26 01:57
閱讀 3266·2023-04-25 16:30
閱讀 2338·2021-11-17 09:38
閱讀 1090·2021-10-08 10:14
閱讀 1396·2021-09-23 11:21
閱讀 3693·2019-08-29 17:28
閱讀 3465·2019-08-29 15:27
閱讀 955·2019-08-29 13:04