Java使用原子类进行多线程的 i++ 操作示例

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

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

输出结果:

232849_vk38_2437179.png

出现这种情况是因为,addAndGet()方法是原子性的,但方法和方法之间的调用却不是原子的。解决这样的问题必须用到同步。

给addNum() 方法加上 同步锁既解决以上问题。

 

 

 

转载于:https://my.oschina.net/xiaozhiwen/blog/1608118

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mybatis实战教程(mybatis in action)之二:以接口的方式编程

前面一章&#xff0c;已经搭建好了eclipse,mybatis,mysql的环境&#xff0c;并且实现了一个简单的查询。请注意&#xff0c;这种方式是用SqlSession实例来直接执行已映射的SQL语句&#xff1a;session.selectOne("com.yihaomen.mybatis.models.UserMapper.selectUserByID&…

Linux内核分析06

进程的描述和进程的创建 一&#xff0c;进程的描述 进程控制块PCB——task_struct &#xff08;进程描述符&#xff09;&#xff0c;为了管理进程&#xff0c;内核必须对每个进程进行清晰的描述&#xff0c;进程描述符提供了内核所需了解的进程信息。 struct task_struct数据结…

【pyqt5学习】——pyqt5中.qrc资源文件的创建与编写

目录 一、说明 二、安装pyqt5以及相关工具&#xff08;pyqt5、pyuic、pqrcc&#xff09; 三、创建.ui文件 1、选中文件右键-external-pyqt5 打开GUI设计界面 2、创建一个界面&#xff08;内含四个等大label框&#xff09; 3、CTRLS保存 4、找到ui文件&#xff0c;右键--e…

C#学习笔记——25个经典问题

1.静态成员和非静态成员的区别&#xff1f; 2.const 和 static readonly 区别&#xff1f; 3.extern 是什么意思&#xff1f; 4.abstract 是什么意思&#xff1f; 5.internal 修饰符起什么作用&#xff1f; 6.sealed 修饰符是干什么的&#xff1f; 7.override 和 o…

PHP的学习--RSA加密解密

PHP服务端与客户端交互或者提供开放API时&#xff0c;通常需要对敏感的数据进行加密&#xff0c;这时候rsa非对称加密就能派上用处了。 举个通俗易懂的例子&#xff0c;假设我们再登录一个网站&#xff0c;发送账号和密码&#xff0c;请求被拦截了。 密码没加密&#xff0c;那攻…

【pyqt5学习】——最新版:配置external tools(designer、pyuic、pqrcc)

目录 1、pip install PyQt5 2、pip install pyqt5-tools 3、file-settings-tools-external tool 点击加号定义工具名字&#xff0c;名字随意便于区分即可 双击每一个工具名字&#xff0c;配置路径&#xff08;注意每一个exe的路径&#xff09; designer.exe pyuic.exe py…

Linux中vi命令详解

最近vi用的多&#xff0c;很多技巧不知道&#xff0c;备注一份&#xff0c; vi编辑器是所有Unix及Linux系统下标准的编辑器&#xff0c;它的强大不逊色于任何最新的文本编辑器&#xff0c;这里只是简单地介绍一下它的用法和一小部分指令。由于 对Unix及Linux系统的任何版本&…

Monkey脚本编写

脚本优势&#xff1a;简单、快捷、不需要借助任何工具&#xff0c;可以做简单的性能测试 脚本缺点&#xff1a;只能简单实现坐标、按键等基本操作&#xff0c;无逻辑性 脚本格式&#xff1a; 脚本API&#xff1a; 例子&#xff1a; 打开浏览器&#xff0c;输入WWW.jikexueyuan.…

Tableview中Dynamic Prototypes动态表的使用

Tableview时IOS中应用非常广泛的控件&#xff0c;当需要动态的添加多条不同的数据时&#xff0c;需要用动态表来实现&#xff0c;下面给出一个小例子&#xff0c;适用于不确定Section的数目&#xff0c;并且每个Section中的行数也不同的情况&#xff0c;适合新手。首先&#xf…

appium 环境搭建 java

1 安装node.js 1.1 安装node.js http://nodejs.cn/download/ 1.2、下载后直接点击exe,按照提示一步一步的安装 1.3 安装成功后&#xff0c;运行cmd&#xff0c;输入node –v&#xff0c;如果安装成功&#xff0c;会输出如下版本信息 2 eclipse android开发环境搭建 2.1 用eclip…

C# 事件机制

在所有关于C#事件机制的介绍中&#xff0c;我更倾向于发布者/订阅者&#xff08;Publisher/Subscriber&#xff09;这种描述。理解事件机制并不是一件容易的事情&#xff0c;它所涉及的思想值得我们好好去研究。 本文资源来自《C#与.NET技术平台实战演练》——中国青年出版社 …

【数据库学习】——从零学习SQL语句(含SQL数据类型、SQL语句实例操作)

目录 ​ 0、创建数据库 1、调用指定的数据库 2、创建数据表 2.1、SQL数据类型 1&#xff09;.字符型数据&#xff1a; 3&#xff09;.整数型数据 4&#xff09;.精确小数型数据 5&#xff09;.近似数值类型 6&#xff09;.货币型数据 7&#xff09;.位类型数据 2.2…

struts2学习笔记(常见错误)

1、由于笔者使用的时最新的struts2 (version 2.5.14.1)&#xff0c;之前下载的是all &#xff0c; 一直配置不上&#xff0c;然后查了google才下载的min版本。 这里面有配置struts2需要的必备的jar包&#xff0c;而至于上面的all里面lib里面的jar包实在太多&#xff0c;虽然我…

C#图解教程 第十二章 数组

数组数组定义重要细节数组的类型数组是对象一维数组和矩形数组实例化一维数组或矩形数组访问数组元素初始化数组显式初始化一维数组显式初始化矩形数组快捷语法隐式类型数组综合内容交错数组声明交错数组快捷实例化实例化交错数组比较矩形数组和交错数组foreach语句迭代变量是只…

【数据库学习】——windows、MySQL构建新闻管理系统(控制台版)

学习记录&#xff1a;【Python项目实战】PythonMySQL开发新闻管理系统全集_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Qb4y1b75q?p2&spm_id_frompageDriver 目录 一、项目介绍 1、项目结构 2、系统部分功能提前展示 3、项目流程图 4、项目设计的数据库以及…

微信红包API接口(PHP)

发布时间&#xff1a;2015年2月25日 / 分类&#xff1a;WEB开发,PHP / 74,825 / 241 ℃ 根据微信高级红包接口&#xff0c;开发PHP版本的API接口&#xff0c;现在进行主要代码分析。 红包接口调用请求代码&#xff0c;所有请求参数为必填参数与文档对应&#xff1a; 1234567891…

2016年个人技术总结(前端)

自我总结 参与项目 备注:[☆-表示比较吊的项目,-从头开始做,^-中间加入项目] 神马生活(微信公众号商城)[^] 神马学院[] <!------跳槽线--------> 大数据套件[☆][^] fable数据营销平台(加入新功能&#xff0c;交互)[^] fit问卷系统[] fit投放系统[] fit画像[^] 理财通点击…

彩色CCD相机工作原理

原理 黑白&#xff08;单色&#xff09;相机 CCD原理并不复杂。我们可以把它想象成一个顶部被打开的记忆芯片。因此光束可以射到记忆单元中。根据"光电效应”&#xff0c;这些光束在记忆单元中产生负电荷&#xff08;下图中右上部分&#xff09;。 曝光后&…

【HTML学习】——HTML常见标签属性和方法介绍

目录 1、HTML分块--------< div> 2、HTML段落--------< p> 3、HTML标题--------< h1>…< h6> 4、HTML链接--------< a> 1)< a href“http://www.baidu.com”>百度< /a>&#xff08;点击百度&#xff0c;直接跳转到网页&#xf…

开发者应警惕的七种糟糕职业规划错误

那些心灵鸡汤式的说辞总爱美化失败&#xff1a;失败是成功之母啦、失败使人成长啦、别畏惧失败等等。但事实上&#xff0c;这种思路在软件开发领域也许并不适用——至少不完全适用。每位开发者在职业生涯中都不可避免会遭遇失败&#xff0c;但为什么不从他人的经验中汲取教训来…