Java使用原子类进行多线程的 i++ 操作示例
2019独角兽企业重金招聘Python工程师标准>>>
使用AtomicInteger原子类进行 i ++ 操作 可以有类似 synchronized 实现同步的效果。
原子操作是不能分割的整体,没有其他线程能够中断或检查正在原子操作中的变量。一个原子类型就是一个原子操作可用的类型,它可以在没有锁的情况下做到线程安全。
示例1:
AddCountThread.java
import java.util.concurrent.atomic.AtomicInteger;public class AddCountThread extends Thread {private AtomicInteger count = new AtomicInteger(0);@Overridepublic void run() {for(int i=0;i<10000;i++){System.out.println(count.incrementAndGet());}}
}
Run_Atomic.java
public class Run_Atomic {public static void main(String[] args) {AddCountThread countService = new AddCountThread();Thread t1 = new Thread(countService);t1.start();Thread t2 = new Thread(countService);t2.start();Thread t3 = new Thread(countService);t3.start();Thread t4 = new Thread(countService);t4.start();Thread t5 = new Thread(countService);t5.start();}
}
输出结果成功地累加到 50000
但是原子类也并不是完全安全的,比如以下例子
示例2:
MyService.java
import java.util.concurrent.atomic.AtomicLong;public class MyService {public static AtomicLong aiRef = new AtomicLong();public void addNum() {System.out.println(Thread.currentThread().getName() + "加了100之后的结果是:" + aiRef.addAndGet(100));aiRef.addAndGet(1);} }
MyThread.java
public class MyThread extends Thread {private MyService myService;public MyThread (MyService myService) {super();this.myService = myService;}@Overridepublic void run() {myService.addNum();} }
Run3_1.java
public class Run3_1 {public static void main(String[] args) {try {MyService myService = new MyService();MyThread[] array = new MyThread[8];for(int i=0;i<array.length;i++) {array[i] = new MyThread(myService);}for (int i = 0;i<array.length;i++ ){array[i].start();}Thread.sleep(1000);System.out.println(myService.aiRef.get());}catch (InterruptedException e) {e.printStackTrace();}} }
输出结果:
出现这种情况是因为,addAndGet()方法是原子性的,但方法和方法之间的调用却不是原子的。解决这样的问题必须用到同步。
给addNum() 方法加上 同步锁既解决以上问题。
转载于:https://my.oschina.net/xiaozhiwen/blog/1608118
Java使用原子类进行多线程的 i++ 操作示例相关推荐
- java原子变量的作用_AtomicInteger原子类的作用介绍(代码示例)
本篇文章给大家带来的内容是关于AtomicInteger原子类的作用介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. AtomicInteger 原子类的作用 多线程操 ...
- java并发:原子类之AtomicLong
原子类之AtomicLong java线程中的操作,需要满足原子性.可见性等原则,比如i++这样的操作不具备原子性, A线程读取了i,另一个线程执行i++,A线程再执行i++就会引发线程安全问题 推荐 ...
- java 并发: 原子类
相关文章: 1.原子类 ,锁 http://blog.csdn.net/youyou1543724847/article/details/52735510 2.多线程相关的 3.线程安全的集合 ...
- Java基础-原子类、CAS
1.什么是原子类 原子类的作用和锁类似,是为了保证并发情况下的线程安全.不过原子类相比锁,有一定优势 粒度更细:他锁的范围更小 效率更高:相比于锁,效率更高,除了高度竞争的情况 2.6类原子类 Ato ...
- 「死磕Java并发编程」说说Java Atomic 原子类的实现原理
<死磕 Java 并发编程>系列连载中,大家可以关注一波. 「死磕 Java 并发编程」阿里二面,面试官:说说 Java CAS 原理? 「死磕 Java 并发编程」面试官:说说什么是 J ...
- 彻底理解Java并发:Java并发原子类
本篇内容包括:原子类概述.原子类分类(Atomic 基本类型原子类.Array 数组类型原子类.Atomic\Reference 引用类型原子类.Atomic\FieldUpdater 原子更新属性. ...
- atomic原子类实现机制_深入了解Java atomic原子类的使用方法和原理
在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...
- (转)Java atomic原子类的使用方法和原理(一)
在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...
- python线程池操作_Python mutiprocessing多线程池pool操作示例
本文实例讲述了Python mutiprocessing多线程池pool操作.分享给大家供大家参考,具体如下: python - mutiprocessing 多线程 pool 脚本代码: root@ ...
最新文章
- java泛型 简书_一文带你认识Java泛型基础
- java异常——捕获异常+再次抛出异常与异常链
- Java实例---计算器实例
- 使用Xmodem恢复交换机IOS
- Java学习福利,入门到精通学习路线分享
- Git根据文件名字查询修改文件内容
- 如何连接Linux上的服务器 网络编程,Linux 网络编程 一
- eclipse lombok 标红_无法使Lombok项目在Eclipse上运行
- Java3种错误_3种常见的Class级别的错误
- python多元回归因子选取_Python中的多元回归(带因子选择)
- C#结合VS开发WinForm学习笔记
- AIS 2021顶级论文报告会论文征集与听众报名通知
- 宏基aspire拆机触摸_(图) 宏基 Acer 4741G 完全拆解
- 电容或电感的电压_电感电容等储能元件
- Error writing to registry key: RegSetValueEx failed; code 5
- DW怎么把模板拽进html文件中,在Dreamweaver中如何使用模板
- 查询计算机物理地址指令,怎么查询mac地址命令_如何查mac地址
- C语言小项目--扫雷小游戏
- 未安装360系列应用情况下,Edge浏览器主页被360篡改,一直显示360导航
- 网关短信 群发 为什么卡发短信 群发 贵 ?
热门文章
- golang延时_golang 实现延迟消息原理与方法
- cad线性标注命令_CAD线性标注如何使用的
- python flask上传文件_Python-Flask-文件上传
- 【theano-windows】学习笔记十四——堆叠去噪自编码器
- Sublime优美设置(待续)
- Tensorflow一些常用基本概念与函数
- socket补充:通信循环、链接循环、远程操作及黏包现象
- css 清除浮动float 嗒嘀嗒滴 ----20181120
- PKUSC2018训练日程(4.18~5.30)
- 上传文件大小限制,webconfig和IIS配置大文件上传