volatile和synchronized的區別

2021-08-20 06:37:46 字數 2582 閱讀 3175

public

class

runthread

extends

thread

public

void

setrunning(boolean isrunning)

@override

public

void

run()

system.out.println("執行緒執行完成了");

}}public

class

run catch (interruptedexception e)

}}

volatile

private

boolean isrunning = true;

當對volatile標記的變數進行修改時,會將其他快取中儲存的修改前的變數清除,然後重新讀取。一般來說應該是先在進行修改的快取a中修改為新值,然後通知其他快取清除掉此變數,當其他快取b中的執行緒讀取此變數時,會向匯流排傳送訊息,這時儲存新值的快取a獲取到訊息,將新值穿給b。最後將新值寫入記憶體。當變數需要更新時都是此步驟,volatile的作用是被其修飾的變數,每次更新時,都會重新整理上述步驟。

public

synchronized

void

synmethod()

當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,其他執行緒對object中所有其它synchronized(this)同步**塊的訪問將被阻塞。  

然而,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,另乙個執行緒仍然可以訪問該object中的除synchronized(this)同步**塊以外的部分。 

第三個例子同樣適用其它同步**塊。也就是說,當乙個執行緒訪問object的乙個synchronized(this)同步**塊時,它就獲得了這個object的物件鎖。結果,其它執行緒對該object物件所有同步**部分的訪問都被暫時阻塞。  

以上規則對其它物件鎖同樣適用。

public

class

thread2 catch (interruptedexception ie)

} }

} public

void

m4t2() catch (interruptedexception ie)

} }

public

static

void

main(string args) }, "t1" );

thread t2 = new thread( new runnable() }, "t2" );

t1.start();

t2.start();

} }

wait():釋放占有的物件鎖,執行緒進入等待池,釋放cpu,而其他正在等待的執行緒即可搶占此鎖,獲得鎖的執行緒即可執行程式。而sleep()不同的是,執行緒呼叫此方法後,會休眠一段時間,休眠期間,會暫時釋放cpu,但並不釋放物件鎖。也就是說,在休眠期間,其他執行緒依然無法進入此**內部。休眠結束,執行緒重新獲得cpu,執行**。wait()和sleep()最大的不同在於wait()會釋放物件鎖,而sleep()不會!

public

inte***ce

lock

lock lock = ...;

lock.lock();

trycatch(exception ex)finally

lock lock = ...;

if(lock.trylock()) catch(exception ex)finally

}else

public

void

method() throws interruptedexception

finally

}

當乙個執行緒獲取了鎖之後,是不會被interrupt()方法中斷的。因為本身在前面的文章中講過單獨呼叫interrupt()方法不能中斷正在執行過程中的執行緒,只能中斷阻塞過程中的執行緒。

reentrantlock,意思是「可重入鎖」,是唯一實現了lock介面的類,並且reentrantlock提供了更多的方法。

public

class

test ;

}.start();

new thread();

}.start();

} public

void

insert(thread thread)

} catch (exception e) finally

}}

class myclass 

public

synchronized

void

method2()

}

volatile和synchronized的區別

關於可見性的問題 可見性 即當讀寫兩個執行緒同時訪問同乙個變數時,用於確保寫執行緒更新變數後,讀執行緒再訪問該 變數時可以讀取到該變數最新的值。volatile和synchronized的區別 1.volatile本質是在告訴jvm當前變數在暫存器 工作記憶體 中的值是不確定的,需要從主存中讀取 s...

volatile和synchronize的區別

1.對變數的寫入操作不依賴變數的當前值,或者你能確保只有單個執行緒更新變數的值。2.該變數沒有包含在具有其他變數的不變式中。volatile僅能使用在變數級別 synchronized則可以使用在變數 方法 和類級別的 volatile僅能實現變數的修改可見性,不能保證原子性 而synchroniz...

volatile和synchronized的區別

volatile和synchronized的區別 1.volatile本質是在告訴jvm當前變數在暫存器 工作記憶體 中的值是不確定的,需要從主存中讀取 synchronized則是鎖定當前變數,只有當前執行緒可以訪問該變數,其他執行緒被阻塞住。2.volatile僅能使用在變數級別 synchro...