volatile非原子性示例

volatile非原子性示例

学习了:《Java多线程编程核心技术》高洪岩 著 Page124

package com.stono.thread2.page124_2;

public class MyThread extends Thread {
    volatile public static int count;
    private static void addCount() {
        for(int i=0;i<100;i++) {
            count++;
        }
        System.out.println("count="+count);
    }
    @Override
    public void run() {
        addCount();
    }
}
package com.stono.thread2.page124_2;

public class Run {

    public static void main(String[] args) {
        MyThread [] myThreads = new MyThread[100];
        for(int i=0;i<100;i++) {
            myThreads[i] = new MyThread();
        }
        for(int i=0;i<100;i++) {
            myThreads[i].start();
        }
    }

}

构建一个线程,里面一个volatile变量,run方法中将这个变量增加100次;

构建100个线程数组,运行start方法,发现变量自增的时候会出现非线程安全问题;

如果修改为:

package com.stono.thread2.page124_2;

public class MyThread extends Thread {
    volatile public static int count;
    private static void addCount() {
        for(int i=0;i<100;i++) {
            synchronized (MyThread.class) { // 保证自增的时候是线程安全的
                count++;
            }
        }
        System.out.println("count="+count);
    }
    @Override
    public void run() {
        addCount();
    }
}

最后的累加结果是正确的,但是中途的输出结果会存在非线程安全问题;

原文地址:https://www.cnblogs.com/stono/p/8449268.html