先参考一个例子 http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html#!comments

即使只是i++,实际上也是由多个原子操作组成:read i; inc; write i,假如多个线程同时执行i++,volatile只能保证他们操作的i是同一块内存,但依然可能出现写入脏数据的情况。如果配合Java 5增加的atomic wrapper classes,对它们的increase之类的操作就不需要sychronized。

使用AtomicInteger,它封装了一些integer的原子操作,并使之线程安全

package threadTest;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerTestApp1 {public static AtomicInteger count = new AtomicInteger(0);public static void inc() {//      count++;
        count.incrementAndGet();}public static void main(String[] args) throws InterruptedException {ExecutorService service= Executors.newFixedThreadPool(Integer.MAX_VALUE);for (int i = 0; i < 10000; i++) {service.execute(new Runnable() {@Overridepublic void run() {ThreadPoolTestApp1.inc();}});}service.shutdown();//给予一个关闭时间(timeout),但是实际关闭时间应该会这个小service.awaitTermination(300, TimeUnit.SECONDS);System.out.println("运行结果:Counter.count=" + ThreadPoolTestApp1.count);}
}

Java中的原子操作包括:
1)除long和double之外的基本类型的赋值操作
2)所有引用reference的赋值操作
3)java.concurrent.Atomic.* 包中所有类的一切操作
count++不是原子操作,是3个原子操作组合
1.读取主存中的count值,赋值给一个局部成员变量tmp
2.tmp+1
3.将tmp赋值给count

线程安全的atomic wrapper classes例子相关推荐

  1. 一步一步掌握线程机制(六)---Atomic变量和Thread局部变量

    一步一步掌握线程机制(六)---Atomic变量和Thread局部变量 前面我们已经讲过如何让对象具有Thread安全性,让它们能够在同一时间在两个或以上的Thread中使用.Thread的安全性在多 ...

  2. [Java] 基本資料包裝類別 Wrapper Classes

    基本型別包裝 (Wrapper Classes) 將基本型別生成物件,要將基本型別先包裝成物件,才能執行生成, Boxing: Integer a = new Integer(1) Unboxing: ...

  3. java多线程 线程安全_Java中的线程安全

    java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...

  4. java中关键字volatile的作用(转载)

    转载:http://blog.csdn.net/orzorz/article/details/4319055 用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对 ...

  5. java 关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  6. Java中volatile的作用以及用法

    volatile让变量每次在使用的时候,都从主存中取.而不是从各个线程的"工作内存". volatile具有synchronized关键字的"可见性",但是没有 ...

  7. 【精】JAVA各大厂问题汇总-HELLO XF

    [精]各大厂问题汇总 创建时间: 2022/6/26 14:34 更新时间: 2023/3/21 19:27 作者: HelloXF 标签: 知识库, 重要文件 Java 基础 JAVA SE $关键 ...

  8. Java 多线程面试题及回答

    http://www.ituring.com.cn/article/111835   1. 有 T1.T2.T3 三个线程,如何怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后 执行? ...

  9. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

最新文章

  1. 40个常用的网站制作技巧
  2. java动态代理_Java代理模式及动态代理详解
  3. 关系类型总结和对应的注解
  4. python表白代码如何运行-程序员如何实现表白代码
  5. django之jquery完成ajax
  6. 前端学习(3328):闭包的形式4
  7. 用Create Fishnet来生成格网
  8. DatabaseMetaData information is not known for server DB2/xxx by this version of JDBC driver
  9. pytorch学习笔记(二十七):Batch-Norm
  10. es搜索准实时的理解
  11. 设计自己的线程局部存储
  12. 贺利坚老师汇编课程25笔记:LOOP指令看CX
  13. UGUI自定义组件之Image根据Text大小自动调整
  14. FREESPACE 发布 logo v1.1
  15. 硬币找钱问题(最小硬币和问题)详解与代码实现
  16. 杀毒软件 McAfee 创始人自杀,75 年传奇人生画下句号
  17. (附源码)ssm停车位共享系统app 毕业设计 041534
  18. cordova下使用高德地图js api在4g流量下定位失败问题的解决
  19. php实现bigpipe
  20. 微信小程序---canvas

热门文章

  1. 安装mysql数据库及问题解决方法
  2. 解决git配置公钥仍然需要输入密码问题
  3. FutureTask的get()方法之异常处理
  4. Eclipse alt+/语法不提示的解决方法
  5. 解决ADB启动问题(Failed to initialize Monitor Thread: Unable to establish loopback connection)
  6. C++之异常捕获和处理
  7. Ubuntu 16.04 安装 VMware Tools(解决windows和Ubuntu之间不能互相复制粘贴文件的问题)
  8. Eclipse中Errors occurred during the build最简单的解决方法
  9. 深度学习解决NLP问题:语义相似度计算
  10. Sublime Text 3 注册码失效(被移除)解决方法