文档章节

java原子性操作理解

y
 yiqifendou
发布于 2016/09/29 18:49
字数 275
阅读 23
收藏 0
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;

/**
 * Created by wangzhongbao on 2016/9/28.
 */
public class TestAtomicOperate {
	private static int increCount = 1000000;
	//private static int num = 0;
	public static void main(String[] args) {
		TestAtomicOperate t = new TestAtomicOperate ();
		t.testDirectOperate(1000);
		t.testNotAtomicOperate(1000);
		t.testAtomicOperate(1000);

	}

	class NumRef{
		long num;
		public NumRef(long num){
			this.num = num;
		}
	}
	private int a = 0;
	private void testNotAtomicOperate(int threadCount){

		NumRef resultNr = new NumRef(0);
		AtomicInteger cai = new AtomicInteger(0);
		for(int i=0;i<threadCount;i++){
			new Thread(){
				@Override
				public void run() {
					for(int i=0;i<increCount;i++){
						resultNr.num++;
					}
					cai.incrementAndGet();
					if(cai.get()==threadCount){
						System.out.println("非原子性操作执行完毕,结果为: " + resultNr.num);
					}
				}
			}.start();
		}
	}

	private void testAtomicOperate(int threadCount){
		AtomicLong resultAi = new AtomicLong(0);
		AtomicInteger cai = new AtomicInteger(0);
		for(int i=0;i<threadCount;i++){
			new Thread(){
				@Override
				public void run() {
					for(int i=0;i<increCount;i++){
						resultAi.incrementAndGet();
					}
					cai.incrementAndGet();
					if(cai.get()==threadCount){
						System.out.println("原子性操作执行完毕,结果为:" + resultAi.get());
					}
				}
			}.start();
		}
	}
	private void testDirectOperate(int threadCount){
		long result = 0;
		for(int i=0;i<threadCount;i++){
			for(int j=0;j<increCount;j++){
				result++;
			}
		}
		System.out.println("单线程直接计算:"+result);
	}


}

执行结果如下:

单线程直接计算:1000000000

非原子性操作执行完毕,结果为: 984932415

原子性操作执行完毕,结果为:1000000000

由此可见:java里面 ++ 操作是非原子性的,线程不安全,所以java提供了AtomicInteger等类

© 著作权归作者所有

共有 人打赏支持
y
粉丝 5
博文 53
码字总数 9177
作品 0
南京
Java并发学习之Volatile及内存模型探究

volatile工作原理 java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。 Java语言提供了volatile,在某些情况下比锁更加方便...

小灰灰Blog
2017/11/02
0
0
再有人问你synchronized是什么,就把这篇文章发给他。

在《深入理解Java虚拟机》中,有这样一段话: synchronized关键字在需要原子性、可见性和有序性这三种特性的时候都可以作为其中一种解决方案,看起来是“万能”的。的确,大部分并发控制操作...

Java填坑之路
08/07
0
0
【Java并发专题】27篇文章详细总结Java并发基础知识

努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! github:https://github.com/CL0610/Java-concurrency,欢迎题issue和Pull request。所有的文档都是自己亲自码的,如果觉...

你听___
05/06
0
0
再有人问你Java内存模型是什么,就把这篇文章发给他。

前几天,发了一篇文章,介绍了一下JVM内存结构、Java内存模型以及Java对象模型之间的区别。有很多小伙伴反馈希望可以深入的讲解下每个知识点。Java内存模型,是这三个知识点当中最晦涩难懂的...

Java架构
07/11
0
0
终于有人把Java内存模型(JMM)说清楚了

网上有很多关于Java内存模型的文章,在《深入理解Java虚拟机》和《Java并发编程的艺术》等书中也都有关于这个知识点的介绍。但是,很多人读完之后还是搞不清楚,甚至有的人说自己更懵了。本文...

消失er
08/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

身处小公司,如何在2年内快速突破,拿到大厂offer?|掘金技术征文

本文是我一个朋友的经历,谨以此文告诉那些向往更好的未来发展而一直努力奋斗的朋友们。不管你现在身处什么小公司,都不要气馁,机会还是有的,只要你敢于拼搏奋斗,我相信你一定可以成功的。...

SuShine
33分钟前
1
0
web应用防火墙的作用

web应用防火墙也被称为网站应用级入侵防御系统,按照一些常规的定义,WAF是指通过一些列针对HTTP/HTTPS的安全策略专门为web应用提供保护的产品。它主要用于防御针对网络应用层的攻击,像SQL...

上树的熊
34分钟前
2
0
5分钟掌握var,let和const异同

转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 原文出处:https://dzone.com/articles/javascript-difference-between-var-let-and-const-...

葡萄城技术团队
37分钟前
5
0
gif工具ffmpeg 的安装

ffmpeg 是一个可以将视频生成gif 格式的图片的工具, 下面说说如何安装这个工具吧: 1、 2 3 4 5 配置环境变量:

wangyanbao
38分钟前
1
0
RocketMq在windows下安装

mqnamesrv.cmd -n localhost:9876#启动namesrvmqbroker.cmd #启动brokermqbroker.cmd -n localhost:9876 autoCreateTopicEnable=true//启动控制台java -jar rocketmq-console-ng......

王桥修道院副院长
39分钟前
1
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部