volatile關(guān)鍵字用法 static和Volatile的區(qū)別?
static和Volatile的區(qū)別?變量被放在主內(nèi)存中,每個(gè)使用變量的線程都會將一個(gè)副本從主內(nèi)存復(fù)制到自己的工作區(qū)進(jìn)行操作。JAVA內(nèi)存模型負(fù)責(zé)保持主內(nèi)存區(qū)域中字段的值與每個(gè)線程的工作區(qū)同步,即保持
static和Volatile的區(qū)別?
變量被放在主內(nèi)存中,每個(gè)使用變量的線程都會將一個(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語言規(guī)范的官方解釋:
1)如果一個(gè)字段被聲明為靜態(tài)的,那么該字段實(shí)際上只存在一個(gè)條目,而不管可以創(chuàng)建多少個(gè)類實(shí)例(可能為零)。
2)一個(gè)字段可能被聲明為volatile,在這種情況下,Java內(nèi)存模型保證所有線程都會看到變量的一致值。
java中volatile和synchronize的區(qū)別和比較?
1。Volatile是線程同步的輕量級實(shí)現(xiàn),因此Volatile的性能優(yōu)于synchronize;Volatile只能用來修改變量,synchronize可以用來修改方法和代碼塊。隨著JDK技術(shù)的發(fā)展,同步在執(zhí)行效率上會有很大的提高,所以同步在項(xiàng)目的過程中還是比較普遍的。對volatile的多線程訪問將不會阻塞;而同步將阻塞;
3。Volatile可以保證私有內(nèi)存和主內(nèi)存之間變量的同步,但不能保證變量的原子性;同步可以保證變量的原子性;
4。Volatile是多線程間變量的可見性;synchronize是多線程間訪問資源的同步;對于Volatile修改的變量,可以解決讀取時(shí)變量的可見性問題,但不能保證原子性。對于多線程訪問同一實(shí)例變量,需要鎖同步。