摘要:線程同步提供了兩種策略本文介紹不過,需要先了解一下同步機制的實現,是圍繞被稱為的內部實例實現的。在獲取到釋放這之間,該線程擁有該。當試圖請求一個已經被獨占的時,其他線程將會阻塞。實現線程同步的另一種方法,就是使用。
線程同步 提供了兩種策略
Synchronized Methods
Synchronized Statements
本文介紹 Synchronized Statements
不過,需要先了解一下 Intrinsic Locks
Intrinsic Locks and Synchronization同步機制的實現,是圍繞被稱為 intrinsic lock 的內部實例實現的。Intrinsic lock 在同步機制中發揮兩個作用:強制獨占訪問對象狀態的權限,并建立可見的 happens-before 關系
每一個對象都有一個 intrinsic lock 與之關聯。一般的,一個需要獨占某對象的訪問權限的線程,在訪問該對象的資源之前,需要請求這個對象的 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 時(即該方法與一個類關聯,而不是一個對象),會發生什么?線程會向該類的 Class 對象請求 intrinsic lock。
Synchronized Statements實現線程同步的另一種方法,就是使用 Synchronized Statements。
與 Synchronized Methods 不同,Synchronized Statements 不能自動獲取對象的 intrinsic lock,而是必須明確指明提供了 intrinsic lock 的對象(這也是 Synchronized Statements 的優點,稍后會提到)
例子:
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),而是獨立的創建兩個對象,提供各自獨立的 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。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/65288.html
摘要:這保證了該對象的所有狀態的改變,對于所有線程是可見的為構造函數添加是語法錯誤。 Synchronized Methods 線程同步 提供了兩種策略 Synchronized Methods Synchronized Statements 本文介紹 Synchronized Methods 一個例子 使用 synchronized 關鍵字,使一個方法為 synchronized pu...
摘要:問題的特性的實現原理是否可重入是否是公平鎖的優化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節碼指令,這兩個字節碼指令都需要一個引用類型的參數來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
摘要:問題的特性的實現原理是否可重入是否是公平鎖的優化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節碼指令,這兩個字節碼指令都需要一個引用類型的參數來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
摘要:問題的特性的實現原理是否可重入是否是公平鎖的優化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節碼指令,這兩個字節碼指令都需要一個引用類型的參數來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...
閱讀 2229·2023-04-26 01:57
閱讀 3258·2023-04-25 16:30
閱讀 2334·2021-11-17 09:38
閱讀 1083·2021-10-08 10:14
閱讀 1392·2021-09-23 11:21
閱讀 3689·2019-08-29 17:28
閱讀 3459·2019-08-29 15:27
閱讀 952·2019-08-29 13:04