• 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();
        }
    }

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

  • 相关阅读:
    MySQL_update同一张表
    MySQL_前缀索引_建立
    oracle_partition sample_simple
    oracle_partition sample
    java_java 利用JAX-RS快速开发RESTful 服务
    Java_Spring MVC_Servlet
    匿名函数
    randrange()和random() 函数
    迭代器 生成器 面向过程编程
    enumerate 模块
  • 原文地址:https://www.cnblogs.com/stono/p/8449268.html
Copyright © 2020-2023  润新知