Java多线程之volatile非原子性 - 极悦
Java多线程编程概述
Java多线程的安全问题
Java多线程同步
Java多线程间的通信
Java线程Lock
Java多线程管理
保障线程安全的设计技术
Java锁的优化及注意事项
Java多线程集合
【Java多线程】单例模式与多线程

Java多线程之volatile非原子性

volatile关键字增加了实例变量在多个线程之间的可见性,但是不具备原子性。

package com.wkcto.volatilekw;

/**
 * volatile不是具备原子性
 * Author: 老崔
 */
public class Test03 {
    public static void main(String[] args) {
        //在main线程中创建10个子线程
        for (int i = 0; i < 100; i++) {
            new MyThread().start();
        }
    }

    static class MyThread extends Thread{
        //volatile关键仅仅是表示所有线程从主内存读取count变量的值
        public static  int count;

      /*  //这段代码运行后不是线程安全的,想要线程安全,需要使用synchronized进行同步,如果使用synchronized同时,也就不需要volatile关键了  
      public static void addCount(){
            for (int i = 0; i < 1000; i++) {
                //count++不是原子操作
                count++;
            }
            System.out.println(Thread.currentThread().getName() + " count=" + count);
        }*/

        public synchronized static void addCount(){
            for (int i = 0; i < 1000; i++) {
                //count++不是原子操作
                count++;
            }
            System.out.println(Thread.currentThread().getName() + " count=" + count);
        }

        @Override
        public void run() {
            addCount();
        }
    }
}

 

全部教程