1. 程式人生 > >【轉】AtomicReference與volatile的區別

【轉】AtomicReference與volatile的區別

span com ref 實現 opened click thread some auto

來源:AtomicReference與volatile的區別

AtomicReference與volatile的在可見性上的意義是一致的。

volatile不能保證原子性,AutomicReference實現上則用了volatile和Unsafe.compareAndSwapObject()來分別保證可見性和原子性。

技術分享圖片
 1 package org.liws;
 2 
 3 import java.util.concurrent.atomic.AtomicReference;
 4 import org.junit.Test;
 5 
 6 public class
Snippet { 7 8 private static volatile Integer volatileInt = 0; 9 private static AtomicReference<Integer> atmicRef = new AtomicReference<Integer>(volatileInt); 10 11 /** 驗證volatile不能保證原子性 */ 12 @Test public void test_volatile() throws InterruptedException {
13 for (int i = 0; i < 100; i++) { 14 new Thread(new Runnable() { 15 @Override public void run() { 16 for (int i = 0; i < 10000; i++) { 17 volatileInt++; 18 } 19 } 20 }).start();
21 } 22 Thread.sleep(1000); 23 System.out.println(volatileInt); // something like 398793 24 } 25 26 /** 驗證test_AtomicReference能保證原子性 */ 27 @Test public void test_AtomicReference() throws InterruptedException{ 28 for (int i = 0; i < 100; i++) { 29 new Thread(new Runnable(){ 30 @Override public void run() { 31 for (int i = 0; i < 10000; i++) { 32 while (true) { 33 Integer temp = atmicRef.get(); 34 if (atmicRef.compareAndSet(temp, temp + 1)) { 35 break; 36 } 37 } 38 } 39 } 40 }).start(); 41 } 42 Thread.sleep(1000); 43 System.out.println(atmicRef.get()); //1000000 44 } 45 }
View Code

【轉】AtomicReference與volatile的區別