綜述
待寫
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)存置為無效。線程接下來從主存中讀取共享變量。

歸納起來是:
??線程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();
}