java model.put_深入理解Java内存模型(一)——基础
偶丰富了一下上边提到的例子:
package test034;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class ReorderTest {
private int a = 0;
private int b = 0;
public static void main(String[] args) throws InterruptedException,
ExecutionException {
ReorderTest rt = new ReorderTest();
rt.doTest();
}
public void doTest() throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newFixedThreadPool(2);
//可能出现的结果(关注ThreadATask,ThreadBTask取到的结果)
int num00 = 0; //x=0,y=0
int num10 = 0; //x=1,y=0
int num02 = 0; //x=0,y=2
int num12 = 0; //x=1,y=2
//可能出现的结果(关注主线程取到的结果)
int main00_a = 0;
int main10_a = 0;
int main02_a = 0;
int main12_a = 0;
//可能出现的结果(关注主线程取到的结果)
int main00_b = 0;
int main10_b = 0;
int main02_b = 0;
int main12_b = 0;
int allNum = 100000;
for (int i = 0; i < allNum; i++) {
CountDownLatch latch = new CountDownLatch(1);
Future futureA = executor.submit(new ThreadATask(latch));
Future futureB = executor.submit(new ThreadBTask(latch));
latch.countDown();
if (a==0 && b==0) {main00_a++;}
if (a==1 && b==0) {main10_a++;}
if (a==0 && b==2) {main02_a++;}
if (a==1 && b==2) {main12_a++;}
int x = (Integer) futureB.get(); //取得a
int y = (Integer) futureA.get(); //取得b
if (x==0 && y==0) {num00++;}
if (x==1 && y==0) {num10++;}
if (x==0 && y==2) {num02++;}
if (x==1 && y==2) {num12++;}
if (a==0 && b==0) {main00_b++;}
if (a==1 && b==0) {main10_b++;}
if (a==0 && b==2) {main02_b++;}
if (a==1 && b==2) {main12_b++;}
//重置状态
a = 0;
b = 0;
}
System.out.println("a=0,b=0出现次数:" + main00_a);
System.out.println("a=1,b=0出现次数:" + main10_a);
System.out.println("a=0,b=2出现次数:" + main02_a);
System.out.println("a=1,b=2出现次数:" + main12_a);
System.out.println("");
System.out.println("x=0,y=0出现次数:" + num00);
System.out.println("x=1,y=0出现次数:" + num10);
System.out.println("x=0,y=2出现次数:" + num02);
System.out.println("x=1,y=2出现次数:" + num12);
System.out.println("");
System.out.println("a=0,b=0出现次数:" + main00_b);
System.out.println("a=1,b=0出现次数:" + main10_b);
System.out.println("a=0,b=2出现次数:" + main02_b);
System.out.println("a=1,b=2出现次数:" + main12_b);
executor.shutdown();
}
private class ThreadATask implements Callable {
private CountDownLatch barrier;
public ThreadATask(CountDownLatch barrier) {
this.barrier = barrier;
}
public Integer call() throws InterruptedException,
BrokenBarrierException {
barrier.await(); //
a = 1; // A1
return b; // A2
}
}
private class ThreadBTask implements Callable {
private CountDownLatch barrier;
public ThreadBTask(CountDownLatch barrier) {
this.barrier = barrier;
}
public Integer call() throws InterruptedException,
BrokenBarrierException {
barrier.await();
b = 2; // B1
return a; // B2
}
}
}
java model.put_深入理解Java内存模型(一)——基础相关推荐
- 无招胜有招之Java进阶JVM(三)内存模型
为什么要有内存模型 在介绍Java内存模型之前,先来看一下到底什么是计算机内存模型,然后再来看Java内存模型在计算机内存模型的基础上做了哪些事情.要说计算机的内存模型,就要说一下一段古老的历史,看一 ...
- 一文带你深入理解JVM内存模型
一文带你深入理解JVM内存模型 一.JAVA的并发模型 共享内存模型 在共享内存的并发模型里面,线程之间共享程序的公共状态,线程之间通过读写内存中公共状态来进行隐式通信 该内存指的是主内存,实际上是物 ...
- 深入理解并发内存模型||JMM与内存屏障||多核并发缓存架构 ||JMM内存模型||volatile 关键字的作用 ||JMM 数据原子操作||JMM缓存不一致的问题
深入理解并发内存模型||JMM与内存屏障 多核并发缓存架构 JMM内存模型 volatile 关键字的作用 JMM 数据原子操作 JMM缓存不一致的问题
- 【转】java提高篇(二)-----理解java的三大特性之继承
[转]java提高篇(二)-----理解java的三大特性之继承 原文地址:http://www.cnblogs.com/chenssy/p/3354884.html 在<Think in ja ...
- 深圳java培训:怎样理解 Java 注解和运用注解编程?
深圳java培训:怎样理解 Java 注解和运用注解编程? 注解和使用 先来看下概念首先从注释来看: 注释:给代码添加说明和解释,注释帮助开发人员理解程序.(Comment)说白点就是注释是给人看的. ...
- 深入理解Java虚拟机学习笔记-1.JVM内存模型
JVM内存模型 1.内存模型结构图 名称 特征 作用 配置参数 异常 程序计数器 占用内存小,线程私有, 生命周期与线程相同 大致为字节码行号指示器 无 无 虚拟机栈 线程私有,生命周期与线程相同,使 ...
- Java之内存模型的基础、重排序、顺序一致性、volatile、锁、final
为什么80%的码农都做不了架构师?>>> 深入理解Java内存模型(一)--基础 深入理解Java内存模型(二)--重排序 深入理解Java内存模型(三)--顺序一致性 深入理 ...
- 无招胜有招之Java进阶JVM(四)内存模型plus
一.计算机内存模型: 在多CPU的系统中,每个CPU都有多级缓存,一般分为L1.L2.L3缓存,因为这些缓存的存在,提供了数据的访问性能,也减轻了数据总线上数据传输的压力,同时也带来了很多新的挑战,比 ...
- java 对象压缩_理解Java对象:要从内存布局及底层机制说起,话说....
前言 大家好,又见面了,今天是JVM专题的第二篇文章,在上一篇文章中我们说了Java的类和对象在JVM中的存储方式,并使用HSDB进行佐证,没有看过上一篇文章的小伙伴可以点这里:< 这篇文章主要 ...
最新文章
- 在windows下搭建React Native Android开发环境
- Mocha BSM应用管理——Lotus Domino监控与管理
- win10x64下的redis安装与使用
- 微信小程序开发(一)
- 收藏!AI 最全干货超级大列表,100+ 张速查表全了!
- 使用混合云的SQL Server
- LeetCode 216. 组合总和 III(排列组合 回溯)
- 北航教授吐槽研究生基本废了:985高校成高级蓝翔
- OpenCV 编程简单介绍(矩阵/图像/视频的基本读写操作)
- 普通用户登录PLSQL后提示空白OK对话框错误
- 谷歌出品!机器学习常用术语总结
- 基于PLC的锅炉控制,基于s7-200的锅炉压力控制的设计,基于西门子S7-200plc与MCGS锅炉压力PID控制系统设计
- 西南科技大学计算机专业全国排名,西南科技大学为什么在全国大学排名很低?...
- 通过GlobalMapper获取的地形模型是否适用于BIM模型
- android十大开源项目
- 货郎问题(暴力求解)
- 《机器人构建实战》——1.4 典型机器人
- LIS(最长上升子序列)问题的三种求解方法以及一些例题
- Python学习:通过IMAP收邮件
- 分支函数c语言,C语言练习题2(分支结构 循环结构 数组 函数2009-2012二级真题 ).doc...