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(); } }
最后的累加结果是正确的,但是中途的输出结果会存在非线程安全问题;