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实现约瑟夫环
    Java关键字final、static
    test
    Blog 转移
    kali 国内镜像源,以及PD_tools,Vm_tools的安装
    Ubuntu 安装启动Tomcat
    JDK 安装环境配置(ubuntu)
    Python 正则表达式
    Python MySQLdb Mac安装遇到的问题
  • 原文地址:https://www.cnblogs.com/stono/p/8449268.html
Copyright © 2011-2022 走看看