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++ 操作示例相关推荐

  1. java原子变量的作用_AtomicInteger原子类的作用介绍(代码示例)

    本篇文章给大家带来的内容是关于AtomicInteger原子类的作用介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. AtomicInteger 原子类的作用 多线程操 ...

  2. java并发:原子类之AtomicLong

    原子类之AtomicLong java线程中的操作,需要满足原子性.可见性等原则,比如i++这样的操作不具备原子性, A线程读取了i,另一个线程执行i++,A线程再执行i++就会引发线程安全问题 推荐 ...

  3. java 并发: 原子类

    相关文章:  1.原子类 ,锁  http://blog.csdn.net/youyou1543724847/article/details/52735510 2.多线程相关的 3.线程安全的集合  ...

  4. Java基础-原子类、CAS

    1.什么是原子类 原子类的作用和锁类似,是为了保证并发情况下的线程安全.不过原子类相比锁,有一定优势 粒度更细:他锁的范围更小 效率更高:相比于锁,效率更高,除了高度竞争的情况 2.6类原子类 Ato ...

  5. 「死磕Java并发编程」说说Java Atomic 原子类的实现原理

    <死磕 Java 并发编程>系列连载中,大家可以关注一波. 「死磕 Java 并发编程」阿里二面,面试官:说说 Java CAS 原理? 「死磕 Java 并发编程」面试官:说说什么是 J ...

  6. 彻底理解Java并发:Java并发原子类

    本篇内容包括:原子类概述.原子类分类(Atomic 基本类型原子类.Array 数组类型原子类.Atomic\Reference 引用类型原子类.Atomic\FieldUpdater 原子更新属性. ...

  7. atomic原子类实现机制_深入了解Java atomic原子类的使用方法和原理

    在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...

  8. (转)Java atomic原子类的使用方法和原理(一)

    在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicIntege ...

  9. python线程池操作_Python mutiprocessing多线程池pool操作示例

    本文实例讲述了Python mutiprocessing多线程池pool操作.分享给大家供大家参考,具体如下: python - mutiprocessing 多线程 pool 脚本代码: root@ ...

最新文章

  1. java泛型 简书_一文带你认识Java泛型基础
  2. java异常——捕获异常+再次抛出异常与异常链
  3. Java实例---计算器实例
  4. 使用Xmodem恢复交换机IOS
  5. Java学习福利,入门到精通学习路线分享
  6. Git根据文件名字查询修改文件内容
  7. 如何连接Linux上的服务器 网络编程,Linux 网络编程 一
  8. eclipse lombok 标红_无法使Lombok项目在Eclipse上运行
  9. Java3种错误_3种常见的Class级别的错误
  10. python多元回归因子选取_Python中的多元回归(带因子选择)
  11. C#结合VS开发WinForm学习笔记
  12. AIS 2021顶级论文报告会论文征集与听众报名通知
  13. 宏基aspire拆机触摸_(图) 宏基 Acer 4741G 完全拆解
  14. 电容或电感的电压_电感电容等储能元件
  15. Error writing to registry key: RegSetValueEx failed; code 5
  16. DW怎么把模板拽进html文件中,在Dreamweaver中如何使用模板
  17. 查询计算机物理地址指令,怎么查询mac地址命令_如何查mac地址
  18. C语言小项目--扫雷小游戏
  19. 未安装360系列应用情况下,Edge浏览器主页被360篡改,一直显示360导航
  20. 网关短信 群发 为什么卡发短信 群发 贵 ?

热门文章

  1. golang延时_golang 实现延迟消息原理与方法
  2. cad线性标注命令_CAD线性标注如何使用的
  3. python flask上传文件_Python-Flask-文件上传
  4. 【theano-windows】学习笔记十四——堆叠去噪自编码器
  5. Sublime优美设置(待续)
  6. Tensorflow一些常用基本概念与函数
  7. socket补充:通信循环、链接循环、远程操作及黏包现象
  8. css 清除浮动float 嗒嘀嗒滴 ----20181120
  9. PKUSC2018训练日程(4.18~5.30)
  10. 上传文件大小限制,webconfig和IIS配置大文件上传