Welcome everyone

volatile

java 汪明鑫 89浏览 0评论

volatile保证可见性不能保证原子性

 

《深入理解java虚拟机》中:


/**
 * volatile变量自增运算测试
 * 
 * @author zzm
 */
public class VolatileTest {

    public static volatile int race = 0;

    public static void increase() {
        race++;
    }

    private static final int THREADS_COUNT = 20;

    public static void main(String[] args) {
        Thread[] threads = new Thread[THREADS_COUNT];
        for (int i = 0; i < THREADS_COUNT; i++) {
            threads[i] = new Thread(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10000; i++) {
                        increase();
                    }
                }
            });
            threads[i].start();
        }

        // 等待所有累加线程都结束
        while (Thread.activeCount() > 1)
            Thread.yield();

        System.out.println(race);
    }
}

并没有得到期望的结果

 

volatile的应用场景  (常被用作程序的开关)

volatile boolean shutdownRequested;
	
public void shutdown(){
     shutdownRequested=true;
}
	
public void dowork(){
     while(!shutdownRequested){
			
     }
}

 

volatile主要作用是使变量在多个线程间可见

 

volatile的两个作用:

1)使线程本地内存修改后的变量立即刷进主内存

2)使其他线程本地内存中拿到的数据失效,需要重新去主内存中读取

 

 

当然,volatile还可以防止指令的重排序

 

转载请注明:汪明鑫的个人博客 » volatile

喜欢 (0)

说点什么

您将是第一位评论人!

提醒
avatar
wpDiscuz