文档章节

证明在32位hotspot上,long不是原子操作

maskleo
 maskleo
发布于 2016/07/24 21:57
字数 187
阅读 56
收藏 1

`public class UnatomicLong implements Runnable { private static long test = 0;

private final long val;

public UnatomicLong(long val) {
	this.val = val;
}

@Override
public void run() {
	while (!Thread.interrupted()) {
		test = val; // 两个线程都试图将自己的私有变量val赋值给类私有静态变量test
	}
}

public static void main(String[] args) {
	Thread t1 = new Thread(new UnatomicLong(-1));
	Thread t2 = new Thread(new UnatomicLong(0));

	System.out.println(Long.toBinaryString(-1));
	System.out.println(pad(Long.toBinaryString(0), 64));

	t1.start();
	t2.start();

	long val;
	while ((val = test) == -1 || val == 0) {
		// 如果静态成员test的值是-1或0,说明两个线程操作没有交叉
	}
	
	System.out.println(pad(Long.toBinaryString(val), 64));
	System.out.println(val);

	t1.interrupt();
	t2.interrupt();
}

// prepend 0s to the string to make it the target length
private static String pad(String s, int targetLength) {
	int n = targetLength - s.length();
	for (int x = 0; x < n; x++) {
		s = "0" + s;
	}
	return s;
}

}`

结果为:

1111111111111111111111111111111111111111111111111111111111111111 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000011111111111111111111111111111111 4294967295

本文转载自:http://blog.sina.com.cn/s/blog_605f5b4f0102uw9c.html

共有 人打赏支持
上一篇: 位运算的运用
maskleo
粉丝 18
博文 128
码字总数 17344
作品 0
深圳
程序员
私信 提问
Java 中int和Integer有什么区别

面对上面的问题,你该怎么回答? 典型回答 int 是我们常说的整形数字,是 Java 的 8 个原始数据类型(Primitive Types,boolean、byte、short、char、int、float、double、long)之一。Java ...

我爱春天的毛毛雨
2018/11/14
0
0
Java多线程之JUC原子类AtomicLong

一、AtomicLong的介绍 我们都知道在java中long类型变量占用的字节数是8也就是64位,而在32位的操作系统对64位的数据读写要分成两步完成,每一步取32位操作。这样的话JVM就不能保证对long和d...

老韭菜
2018/07/25
0
0
java中long和double类型操作的非原子性探究

Java中的原子操作包括: 1)除long和double之外的基本类型的赋值操作 2)所有引用reference的赋值操作 3)java.concurrent.Atomic.* 包中所有类的一切操作。 但是java对long和double的赋值操...

oswebgod
2018/07/31
0
0
CUDA学习(四十三)

只读数据缓存加载函数: 只读数据缓存加载功能仅受计算能力3.5和更高的设备支持: 返回位于地址地址处的类型T的数据,其中T为char,short,int,long long unsigned char,unsigned short,u...

night李
2018/02/15
0
0
Java多线程中的long和double

Java虚拟机规范定义的许多规则中有一条:基本类型变量的读取和写入操作必须是原子级操作的。但是对于64位存储的long和double类型来说,JVM读操作和写操作是分开的,这样当多个线程读取一个非...

famiover
2016/10/26
69
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux iptables之mangle表使用案例

mangle表的用途 mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。 mangel表使用示例 示例1-策略路由1 内网的客户机通...

月下狼
今天
3
0
OSChina 周日乱弹 —— 兼职我想去学学布偶戏

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy : 《火炎 - 女王蜂》 《火炎 - 女王蜂》 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁 :还在睡觉突然接到一个小哥哥电话“x...

小小编辑
今天
97
7
租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
4
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
6
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部