Java并發(fā)編程

綜述

待寫

volatile

同步一個共享變量:在多處理器開發(fā)中保證共享變量的“可見性”:當(dāng)一個線程修改一個共享變量時,另外一個線程能讀到這個修改的值。
??1、當(dāng)寫一個volatile變量時,JMM會把該線程對應(yīng)的本地內(nèi)存(cpu緩存)中的共享變量值刷新到主內(nèi)存(cpu使用緩存鎖定或者總線鎖機(jī)制,保證只有一個線程緩存的共享變量值寫到主內(nèi)存,其它線程緩存中的更改了的共享變量值失效(cpu使用嗅探發(fā)現(xiàn)主內(nèi)存對應(yīng)地址中的值是否被修改),從而實現(xiàn)了緩存一致性協(xié)議(阻止同時修改由兩個以上處理器緩存的內(nèi)存區(qū)域數(shù)據(jù)))。
??2、當(dāng)讀一個volatile變量時,JMM會把該線程對應(yīng)的本地內(nèi)存置為無效。線程接下來從主存中讀取共享變量。

volatile內(nèi)存-CPU模型

歸納起來是
??線程A寫一個volatile變量,實質(zhì)上是線程A向接下來要讀這個volatile變量的某個線程發(fā)出了(其對共享變量所做的修改的)消息。
??線程B讀一個volatile變量,實質(zhì)上是線程B接收了之前某個線程發(fā)出的(在寫這個volatile變量之前對共享變量所做修改的)消息。
??線程A寫一個volatile變量,隨后線程B讀這個volatile變量,這個過程實質(zhì)上是線程A通過主內(nèi)存向線程B發(fā)送消息。

簡而言之,volatile的特性如下:
??可見性:對一個volatile變量的讀,總能看到(任意線程)對這個volatile變量最后的寫入。
??原子性:對任意單個volatile變量的讀/寫具有原子性,但類似于volatile++ 這種復(fù)合的操作不具備原子性

class VolatileExample {
    int a = 0;
    volatile boolean flag = false;  
    public void writer() {
        a = 1;
        flag = true;
    }
    public void reader() {
        if (flag) {
            int i = a;
            ……
        }
    }
}

Synchronized

待寫

原子操作的實現(xiàn)原理

待寫

共享內(nèi)存

待寫

??鎖是用來控制多個線程訪問共享資源的方式,一個鎖能防止多個線程同時訪問共享資源(讀寫鎖除外)。在Lock接口出現(xiàn)之前,靠Synchronized關(guān)鍵字實現(xiàn)鎖功能。在Java SE 5之后,并發(fā)包中新增了Lock接口來實現(xiàn)鎖功能,它提供了與Synchronized關(guān)鍵字類似的同步功能,只是在使用時需要顯式地獲取和釋放鎖。雖然它缺少了(通過synchronized塊或方法所提供的)隱式獲取釋放鎖的便捷性但卻擁有了鎖獲取與釋放的可操作性、可中斷的獲取鎖以及超時獲取鎖等多種synchronize關(guān)鍵字所不具備的同步特性。

Lock lock = new ReentrantLock();
lock.lock();
try{
    // dosomethings
} finally {
    lock.unlock();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容