线程安全的atomic wrapper classes例子
先参考一个例子 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例子相关推荐
- 一步一步掌握线程机制(六)---Atomic变量和Thread局部变量
一步一步掌握线程机制(六)---Atomic变量和Thread局部变量 前面我们已经讲过如何让对象具有Thread安全性,让它们能够在同一时间在两个或以上的Thread中使用.Thread的安全性在多 ...
- [Java] 基本資料包裝類別 Wrapper Classes
基本型別包裝 (Wrapper Classes) 將基本型別生成物件,要將基本型別先包裝成物件,才能執行生成, Boxing: Integer a = new Integer(1) Unboxing: ...
- java多线程 线程安全_Java中的线程安全
java多线程 线程安全 Thread Safety in Java is a very important topic. Java provides multi-threaded environme ...
- java中关键字volatile的作用(转载)
转载:http://blog.csdn.net/orzorz/article/details/4319055 用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对 ...
- java 关键字volatile的作用
用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...
- Java中volatile的作用以及用法
volatile让变量每次在使用的时候,都从主存中取.而不是从各个线程的"工作内存". volatile具有synchronized关键字的"可见性",但是没有 ...
- 【精】JAVA各大厂问题汇总-HELLO XF
[精]各大厂问题汇总 创建时间: 2022/6/26 14:34 更新时间: 2023/3/21 19:27 作者: HelloXF 标签: 知识库, 重要文件 Java 基础 JAVA SE $关键 ...
- Java 多线程面试题及回答
http://www.ituring.com.cn/article/111835 1. 有 T1.T2.T3 三个线程,如何怎样保证 T2 在 T1 执行完后执行,T3 在 T2 执行完后 执行? ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
最新文章
- 40个常用的网站制作技巧
- java动态代理_Java代理模式及动态代理详解
- 关系类型总结和对应的注解
- python表白代码如何运行-程序员如何实现表白代码
- django之jquery完成ajax
- 前端学习(3328):闭包的形式4
- 用Create Fishnet来生成格网
- DatabaseMetaData information is not known for server DB2/xxx by this version of JDBC driver
- pytorch学习笔记(二十七):Batch-Norm
- es搜索准实时的理解
- 设计自己的线程局部存储
- 贺利坚老师汇编课程25笔记:LOOP指令看CX
- UGUI自定义组件之Image根据Text大小自动调整
- FREESPACE 发布 logo v1.1
- 硬币找钱问题(最小硬币和问题)详解与代码实现
- 杀毒软件 McAfee 创始人自杀,75 年传奇人生画下句号
- (附源码)ssm停车位共享系统app 毕业设计 041534
- cordova下使用高德地图js api在4g流量下定位失败问题的解决
- php实现bigpipe
- 微信小程序---canvas
热门文章
- 安装mysql数据库及问题解决方法
- 解决git配置公钥仍然需要输入密码问题
- FutureTask的get()方法之异常处理
- Eclipse alt+/语法不提示的解决方法
- 解决ADB启动问题(Failed to initialize Monitor Thread: Unable to establish loopback connection)
- C++之异常捕获和处理
- Ubuntu 16.04 安装 VMware Tools(解决windows和Ubuntu之间不能互相复制粘贴文件的问题)
- Eclipse中Errors occurred during the build最简单的解决方法
- 深度学习解决NLP问题:语义相似度计算
- Sublime Text 3 注册码失效(被移除)解决方法