zoukankan      html  css  js  c++  java
  • 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();
        }
    }

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

  • 相关阅读:
    Java运行时数据区域
    线程的实现原理
    redis分布式锁的实现
    Incorrect string value: 'xF0x9Fx92x8BTi...'错误
    linux命令之less命令
    Hive数据类型和DDL操作
    Hive安装、配置和使用
    CentOS 7安装配置MySQL 5.7
    Spring+SpringMVC+MyBatis整合
    MyBatis的事物管理和缓存
  • 原文地址:https://www.cnblogs.com/stono/p/8449268.html
Copyright © 2011-2022 走看看