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);}@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非原子性示例相关推荐
- Java内存模型、volatile、原子性、可见性、有序性、happens-before原则
目录 1.硬件的效率与一致性: 缓存一致性(Cache Coherence) 2.Java内存模型 2.1主内存与工作内存 2.2内存间的交互 2.3 volatile型变量的特殊规则 2.3.1 保 ...
- 【多线程】long和double的非原子性协定
long和double的非原子性协定 Java内存模型要求lock.unlock.read.load.assign.use.store.write这8个操作都具有原子性,但是对于64位的数据类型(do ...
- volatile对原子性、可见性、有序性的保证
1.原子性 volatile对原子性的保障有限,32位jvm中的long.double类型的变量赋值操作不是原子的,volatile可以保证它俩的原子性. 2.可见性.有序性 volatile在写操作 ...
- boost::math模块具有输出和输入方面以及字符串流的非有限示例
boost::math模块具有输出和输入方面以及字符串流的非有限示例 实现功能 C++实现代码 实现功能 boost::math模块具有输出和输入方面以及字符串流的非有限示例 C++实现代码 #inc ...
- volatile可以保证原子性吗
在之前我们了解到了线程的三大特性:原子性,可见性,有序性. 前面的例子我们知道了volatile可以保证共享变量的可见性,但是volatile可以保证原子性吗? 我们来看看: public class ...
- 【MicroPython ESP32】NVS数据非易失性存储示例讲解说明
[MicroPython ESP32]NVS数据非易失性存储示例讲解说明 ✨本案例基于Thonny平台开发.✨
- 线程池、volatile、原子性、并发工具类
目录 线程状态 线程池-基本原理 线程池 - Executors默认线程池 线程池 - ThreadPoolExecutor 线程池参数-拒绝策略 volatile 原子性 原子性 - AtomicI ...
- 线程池,Volatile,原子性类AtomicInteger,乐观锁悲观锁,并发工具类Hashtable,ConcurrentHashMap类,Semaphore类
目录 一.线程的状态 二.线程池 1.创建线程池的方式 1.1线程池-Executors默认线程池 1.2线程池-Executors创建指定上限的线程池 1.3线程池-ThreadPoolExec ...
- java 原子long_java中long和double类型操作的非原子性探究
Java中的原子操作包括: 1)除long和double之外的基本类型的赋值操作 2)所有引用reference的赋值操作 3)java.concurrent.Atomic.* 包中所有类的一切操作. ...
最新文章
- 全网最火的Nacos源码构建,你找不到第二个有我仔细的!!
- RIP协议的基本配置(1)
- EXE与SYS通信(缓冲模式)
- python调用库实现返回ping的时延_python网络作业:使用python的socket库实现ICMP协议的ping...
- SharpZipLib压缩解压
- LeetCode 220. 存在重复元素 III(lower_bound)
- 线程放弃 java 1615477619
- Predicate函数式接口
- Oracle BRM处理逻辑
- android 自动更新apk版本
- 【流浪地球】春节十二响程序开源代码
- 深圳信息职业技术学校 计算机辅助设计和制造,大学生职业生涯规划书样稿.doc...
- 浏览器默认主页被篡改(chrome,IE)
- 云计算淡定从容的大局观
- 如何在线批量转换图片格式为jpg?
- python爬取12306_python爬取12306列车信息
- 导线中电流分布和集肤深度
- 从零搭建WNMP环境
- UT、IT、ST、UAT
- 单总线和多总线的区别