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);}@Overridepublic 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);}@Overridepublic void run() {addCount();}
}

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

volatile非原子性示例相关推荐

  1. Java内存模型、volatile、原子性、可见性、有序性、happens-before原则

    目录 1.硬件的效率与一致性: 缓存一致性(Cache Coherence) 2.Java内存模型 2.1主内存与工作内存 2.2内存间的交互 2.3 volatile型变量的特殊规则 2.3.1 保 ...

  2. 【多线程】long和double的非原子性协定

    long和double的非原子性协定 Java内存模型要求lock.unlock.read.load.assign.use.store.write这8个操作都具有原子性,但是对于64位的数据类型(do ...

  3. volatile对原子性、可见性、有序性的保证

    1.原子性 volatile对原子性的保障有限,32位jvm中的long.double类型的变量赋值操作不是原子的,volatile可以保证它俩的原子性. 2.可见性.有序性 volatile在写操作 ...

  4. boost::math模块具有输出和输入方面以及字符串流的非有限示例

    boost::math模块具有输出和输入方面以及字符串流的非有限示例 实现功能 C++实现代码 实现功能 boost::math模块具有输出和输入方面以及字符串流的非有限示例 C++实现代码 #inc ...

  5. volatile可以保证原子性吗

    在之前我们了解到了线程的三大特性:原子性,可见性,有序性. 前面的例子我们知道了volatile可以保证共享变量的可见性,但是volatile可以保证原子性吗? 我们来看看: public class ...

  6. 【MicroPython ESP32】NVS数据非易失性存储示例讲解说明

    [MicroPython ESP32]NVS数据非易失性存储示例讲解说明 ✨本案例基于Thonny平台开发.✨

  7. 线程池、volatile、原子性、并发工具类

    目录 线程状态 线程池-基本原理 线程池 - Executors默认线程池 线程池 - ThreadPoolExecutor 线程池参数-拒绝策略 volatile 原子性 原子性 - AtomicI ...

  8. 线程池,Volatile,原子性类AtomicInteger,乐观锁悲观锁,并发工具类Hashtable,ConcurrentHashMap类,Semaphore类

      目录 一.线程的状态 二.线程池 1.创建线程池的方式 1.1线程池-Executors默认线程池 1.2线程池-Executors创建指定上限的线程池 1.3线程池-ThreadPoolExec ...

  9. java 原子long_java中long和double类型操作的非原子性探究

    Java中的原子操作包括: 1)除long和double之外的基本类型的赋值操作 2)所有引用reference的赋值操作 3)java.concurrent.Atomic.* 包中所有类的一切操作. ...

最新文章

  1. 全网最火的Nacos源码构建,你找不到第二个有我仔细的!!
  2. RIP协议的基本配置(1)
  3. EXE与SYS通信(缓冲模式)
  4. python调用库实现返回ping的时延_python网络作业:使用python的socket库实现ICMP协议的ping...
  5. SharpZipLib压缩解压
  6. LeetCode 220. 存在重复元素 III(lower_bound)
  7. 线程放弃 java 1615477619
  8. Predicate函数式接口
  9. Oracle BRM处理逻辑
  10. android 自动更新apk版本
  11. 【流浪地球】春节十二响程序开源代码
  12. 深圳信息职业技术学校 计算机辅助设计和制造,大学生职业生涯规划书样稿.doc...
  13. 浏览器默认主页被篡改(chrome,IE)
  14. 云计算淡定从容的大局观
  15. 如何在线批量转换图片格式为jpg?
  16. python爬取12306_python爬取12306列车信息
  17. 导线中电流分布和集肤深度
  18. 从零搭建WNMP环境
  19. UT、IT、ST、UAT
  20. 单总线和多总线的区别

热门文章

  1. 我的 FPGA 学习历程(13)—— 电子钟项目
  2. 浅析pinyin4j源码 简单利用pinyin4j对中文字符进行自然排序(转)
  3. Localhost与数据库连接
  4. cpu上下文切换(下)
  5. Chrome之排序问题
  6. Scala for循环示例
  7. MySQL-锁表处理
  8. React 表单与事件
  9. Standby Redo Log 的设定原则、创建、删除、查看、归档位置
  10. mysql开启binlog