成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

線程同步之 Synchronized Statements

Vultr / 2128人閱讀

摘要:線程同步提供了兩種策略本文介紹不過,需要先了解一下同步機制的實現(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

相關文章

  • 線程同步 Synchronized Methods

    摘要:這保證了該對象的所有狀態(tài)的改變,對于所有線程是可見的為構造函數(shù)添加是語法錯誤。 Synchronized Methods 線程同步 提供了兩種策略 Synchronized Methods Synchronized Statements 本文介紹 Synchronized Methods 一個例子 使用 synchronized 關鍵字,使一個方法為 synchronized pu...

    sourcenode 評論0 收藏0
  • JVM解剖公園

    摘要:為此,引入轉換查找緩沖緩存最近的轉換記錄。這個優(yōu)化技術,可以看到將原本對對象的字段訪問,替換為一個局部變量的訪問。當所有線程都在已知的位置停止的時候,被認為是到達了安全點。檢查安全點請求的代碼 showImg(https://segmentfault.com/img/bVbwfcz?w=1024&h=576); 1、JVM鎖粗化和循環(huán)原文標題:JVM Anatomy Quark #1:...

    imingyu 評論0 收藏0
  • 死磕 java同步系列synchronized解析

    摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...

    番茄西紅柿 評論0 收藏0
  • 死磕 java同步系列synchronized解析

    摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...

    番茄西紅柿 評論0 收藏0
  • 死磕 java同步系列synchronized解析

    摘要:問題的特性的實現(xiàn)原理是否可重入是否是公平鎖的優(yōu)化的五種使用方式簡介關鍵字是里面最基本的同步手段,它經過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...

    luxixing 評論0 收藏0

發(fā)表評論

0條評論

Vultr

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<