volatile使用場(chǎng)景 static和Volatile的區(qū)別?
static和Volatile的區(qū)別?變量被放在主內(nèi)存中,每個(gè)使用變量的線程都會(huì)將一個(gè)副本從主內(nèi)存復(fù)制到自己的工作區(qū)進(jìn)行操作。JAVA內(nèi)存模型負(fù)責(zé)保持主內(nèi)存區(qū)域中字段的值與每個(gè)線程的工作區(qū)同步,即保持
static和Volatile的區(qū)別?
變量被放在主內(nèi)存中,每個(gè)使用變量的線程都會(huì)將一個(gè)副本從主內(nèi)存復(fù)制到自己的工作區(qū)進(jìn)行操作。
JAVA內(nèi)存模型負(fù)責(zé)保持主內(nèi)存區(qū)域中字段的值與每個(gè)線程的工作區(qū)同步,即保持一致。
Static:聲明此字段是靜態(tài)的(可能由多個(gè)實(shí)例共享)。在主存中,這個(gè)類的所有實(shí)例的這個(gè)字段都是同一個(gè)變量,即唯一性。
Volatile,聲明變量值的一致性;static,聲明變量的唯一性。
另外,volatile同步機(jī)制不同于synchronized,前者是內(nèi)存同步,后者不僅包括內(nèi)存同步(一致性),還保證線程互斥(互斥)。
Static只聲明主存變量的唯一性,不能保證工作區(qū)變量值與主存變量值的一致性。除非變量的值是不可變的,即使用final修飾符,否則static聲明的變量不是線程安全的。
以下內(nèi)容摘自Java語(yǔ)言規(guī)范的官方解釋:
1)如果一個(gè)字段被聲明為靜態(tài)的,那么該字段實(shí)際上只存在一個(gè)條目,而不管可以創(chuàng)建多少個(gè)類實(shí)例(可能為零)。
2)一個(gè)字段可能被聲明為volatile,在這種情況下,Java內(nèi)存模型保證所有線程都會(huì)看到變量的一致值。
volatile應(yīng)用在什么場(chǎng)景?
Volatile有五種使用場(chǎng)景:1。作為狀態(tài)標(biāo)志
2。一次性安全釋放
3。獨(dú)立觀察
4。易失bean模式
5。低成本讀寫鎖定策略