文档章节

java原子性操作理解

y
 yiqifendou
发布于 2016/09/29 18:49
字数 275
阅读 187
收藏 0

精选30+云产品,助力企业轻松上云!>>>

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
博文 62
码字总数 9177
作品 0
南京
私信 提问
加载中
请先登录后再评论。
深入分析synchronized的实现原理

通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本...

osc_svcyn2cd
2018/04/12
2
0
java中volatile

  volatile用来修饰变量。Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是...

osc_r4nb21xx
2018/02/13
0
0
[Java] Volatile的实现原理

synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起...

1.02^365的成长裂变
03/31
0
0
学妹教你并发编程的三大特性:原子性、可见性、有序性

在并发编程中有三个非常重要的特性:原子性、有序性,、可见性,学妹发现你对它们不是很了解,她很着急,因为理解这三个特性对于能够正确地开发高并发程序有很大的帮助,接下来的面试中也极有...

万猫学社
05/18
0
0
面试必问:Java 内存模型的3个特性

前言 Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能得到一致效果的「机制及规范...

osc_8r37p3dx
04/29
12
0

没有更多内容

加载失败,请刷新页面

加载更多

将字符串拆分为具有多个单词边界定界符的单词 - Split Strings into words with multiple word boundary delimiters

问题: I think what I want to do is a fairly common task but I've found no reference on the web. 我认为我想做的是一项相当普通的任务,但是我在网络上找不到任何参考。 I have text ...

fyin1314
52分钟前
9
0
jQuery选择器中的通配符 - Wildcards in jQuery selectors

问题: I'm trying to use a wildcard to get the id of all the elements whose id begin with "jander". 我正在尝试使用通配符来获取id以“jander”开头的所有元素的id。 I tried $('#jand......

法国红酒甜
今天
19
0
唐山5.1级地震 百度人工智能技术帮上忙:成都减灾所提前30秒让北京、天津市民收到预警

本文作者:y****n 7月12日6时38分在河北唐山市古冶区发生5.1级地震,成都高新减灾研究所与应急管理部门联合建成的大陆地震预警网成功预警该地震,给唐山市提前3秒预警,给天津市提前33秒预警...

百度开发者中心
昨天
30
0
如何使用PHP发送POST请求? - How do I send a POST request with PHP?

问题: Actually I want to read the contents that come after the search query, when it is done. 实际上,我想阅读搜索查询之后的内容,完成之后。 The problem is that the URL only a......

javail
今天
14
0
如何从Java读取文件夹中的所有文件? - How to read all files in a folder from Java?

问题: 如何通过Java读取文件夹中的所有文件? 解决方案: 参考一: https://stackoom.com/question/7jt2/如何从Java读取文件夹中的所有文件 参考二: https://oldbug.net/q/7jt2/How-to-rea...

富含淀粉
今天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部