成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

線程同步之 Synchronized Statements

Vultr / 2172人閱讀

摘要:線程同步提供了兩種策略本文介紹不過,需要先了解一下同步機制的實現(xiàn),是圍繞被稱為的內(nèi)部實例實現(xiàn)的。在獲取到釋放這之間,該線程擁有該。當(dāng)試圖請求一個已經(jīng)被獨占的時,其他線程將會阻塞。實現(xiàn)線程同步的另一種方法,就是使用。

線程同步 提供了兩種策略

Synchronized Methods

Synchronized Statements

本文介紹 Synchronized Statements

不過,需要先了解一下 Intrinsic Locks

Intrinsic Locks and Synchronization

同步機制的實現(xiàn),是圍繞被稱為 intrinsic lock 的內(nèi)部實例實現(xiàn)的。Intrinsic lock 在同步機制中發(fā)揮兩個作用:強制獨占訪問對象狀態(tài)的權(quán)限,并建立可見的 happens-before 關(guān)系

每一個對象都有一個 intrinsic lock 與之關(guān)聯(lián)。一般的,一個需要獨占某對象的訪問權(quán)限的線程,在訪問該對象的資源之前,需要請求這個對象的 intrinsic lock,并在訪問結(jié)束后釋放該 intrinsic lock 。在獲取 lock 到釋放 lock 這之間,該線程擁有該 intrinsic lock 。只要一個線程擁有 intrinsic lock,其他線程將不會獲取該 lock 。當(dāng)試圖請求一個已經(jīng)被獨占的 lock 時,其他線程將會阻塞 。

當(dāng)一個線程釋放 intrinsic lock,該動作將會與隨后的獲取 lock 的請求之間,建立一個 happens-before 關(guān)系 —— 即隨后的被阻塞的線程,可以得知 lock 已被釋放。

Synchronized Methods 中的 Locks

當(dāng)一個線程調(diào)用一個對象的 synchronized method,該線程將自動獲取這個對象的 intrinsic lock,然后在方法 return 時釋放 lock 。即使 method 是因為沒有 catch 的 exception 而返回, 也會釋放 lock

BTW: 當(dāng)調(diào)用一個 static synchronized method 時(即該方法與一個類關(guān)聯(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);
}

上邊的例子中,不同線程調(diào)用 addName 方法在修改 lastName 和 nameCount 時,將會同步。在調(diào)用 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

一個線程不能請求到一個已經(jīng)被其它線程占用的 lock,但一個線程可以請求到一個已經(jīng)被自己占中的 lock。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/65288.html

相關(guān)文章

  • 線程同步 Synchronized Methods

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

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

    摘要:為此,引入轉(zhuǎn)換查找緩沖緩存最近的轉(zhuǎn)換記錄。這個優(yōu)化技術(shù),可以看到將原本對對象的字段訪問,替換為一個局部變量的訪問。當(dāng)所有線程都在已知的位置停止的時候,被認為是到達了安全點。檢查安全點請求的代碼 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)化的五種使用方式簡介關(guān)鍵字是里面最基本的同步手段,它經(jīng)過編譯之后,會在同步塊的前后分別生成和字節(jié)碼指令,這兩個字節(jié)碼指令都需要一個引用類型的參數(shù)來指明要鎖定和解鎖的對象。問題 (1)synchronized的特性? (2)synchronized的實現(xiàn)原理? (3)synchronized是否可重入? (4)synchronized是否是公平鎖?...

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

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

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

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

    luxixing 評論0 收藏0

發(fā)表評論

0條評論

Vultr

|高級講師

TA的文章

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