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

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

volatile非原子性示例的更多相关文章

  1. volatile非原子性的示例

    volatile非原子性的示例 package com.stono.thread2.page124; public class MyThread extends Thread { volatile p ...

  2. 深入理解Atomic原子操作和volatile非原子性

    原子操作可以理解为: 一个数,很多线程去同时修改它,不加sync同步锁,就可以保证修改结果是正确的 Atomic正是采用了CAS算法,所以可以在多线程环境下安全地操作对象. volatile是Java ...

  3. java多线程总结四:volatile、synchronized示例

    1.synchronized保证同步 先看一个生成偶数的类 <span style="font-size:16px;">package demo.thread; /** ...

  4. socket编程的同步、异步与阻塞、非阻塞示例详解

     socket编程的同步.异步与阻塞.非阻塞示例详解之一  分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...

  5. 编写安全代码:小心volatile的原子性误解

    本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载.但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途. ============ ...

  6. 多线程(四)~数据操作的原子性,使用原子性操作AutomicInteger替换非原子性的i++的操作

    这一章,我们要来验证volatile关键字不是原子性的,OK,还是用代码来说话. ①.线程类,操作i++ 500次 package com.multiThread.thread; publicclas ...

  7. Java并发编程的艺术(二)——volatile、原子性

    什么是volatile Java语言允许线程访问共享变量,为了确保共享变量能够被准确一致地更新,如果一个字段被声明为volatile,那么Java内存模型将会确保所有线程看到这个变量时值是一致的.保证 ...

  8. Python正则的贪婪和非贪婪示例

    贪婪匹配 import re info = """ saas12 [STREAM] codec_type=audio111 [/STREAM]-- [STREAM] co ...

  9. mysql、oracle分库分表方案之sharding-jdbc使用(非demo示例)

    选择开源核心组件的一个非常重要的考虑通常是社区活跃性,一旦项目团队无法进行自己后续维护和扩展的情况下更是如此. 至于为什么选择sharding-jdbc而不是Mycat,可以参考知乎讨论帖子https ...

随机推荐

  1. 【Codeforces827D/CF827D】Best Edge Weight(最小生成树性质+倍增/树链剖分+线段树)

    题目 Codeforces827D 分析 倍增神题--(感谢T*C神犇给我讲qwq) 这道题需要考虑最小生成树的性质.首先随便求出一棵最小生成树,把树边和非树边分开处理. 首先,对于非树边\((u,v ...

  2. hcode视频教程中心(学习h5和hbuilder等)

    网站: http://www.hcoder.net/course

  3. 关于java.util.properties的随笔

    public class Propertiesextends Hashtable<Object,Object> Properties 类表示了一个持久的属性集.Properties 可保存 ...

  4. Angular——表单指令

    基本介绍 这些指定只能针对input标签 基本使用 <!DOCTYPE html> <html lang="en"> <head> <me ...

  5. 【转载】HTTP 请求头与请求体

    原文地址: https://segmentfault.com/a/1190000006689767 HTTP Request HTTP 的请求报文分为三个部分 请求行.请求头和请求体,格式如图:一个典 ...

  6. day09-文件的操作

    目录 文件的基本操作 文件 什么是文件 如何使用文件 打开&关闭文件 打开&关闭文件 del f和f.close()的区别 文件路径 打开模式(不写默认是r) 编码格式 补充(open ...

  7. Python 之__slots__的作用

    # 注意:__slots__ 用来限制当前类的实例属性的,如:name.age才可被使用,添加其他的属性则报错 # 不会限制继承类的属性 class Person(): __slots__ = (&q ...

  8. groupbox

    使用groupbox将radiobox 放入其中可以使组框中只选中一个

  9. todey

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> 框架集fromset ...

  10. js移动端 可移动滑块

    document.addEventListener('DOMContentLoaded', function() { //动态创建回到首页dom var backDom = document.crea ...