文档章节

并发环境下,不安全发布对象示例代码

 骑着乌龟赛跑
发布于 2015/08/27 09:43
字数 208
阅读 31
收藏 0
package com.mm.concurrent;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestConcurrent {
	public static void main(String[] args) throws InterruptedException {
		final List<ValueOwner> list = new ArrayList<>(10000);
		for(int i = 0; i < 10000; i++){
			list.add(new ValueOwner());
		}
		
		CountDownLatch latch = new CountDownLatch(1);
		
		CountDownLatch watchDog = new CountDownLatch(200);
		
		ExecutorService es = Executors.newFixedThreadPool(200);
		for(int i = 0; i < 200; i++){
			es.execute(new Runnable() {
				
				@Override
				public void run() {
					try {
						latch.await();
						for(ValueOwner vo : list){
							vo.check();
						}
						watchDog.countDown();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			});
		}
		latch.countDown();
		int n = 0;
		for(ValueOwner vo : list){
			vo.setValue(++n);
		}
		
		watchDog.await();
		es.shutdown();
	}
}

class ValueOwner {
	private int value;

	public ValueOwner() {
	}

	public void setValue(int value) {
		this.value = value;
	}

	public void check() {
		if (value != value) {
			throw new RuntimeException();
		}
	}
}

分析: 调用check的线程取第一个value的时候看到的时 对象初始化的属性值value=0,在读第二个的时候读到的是主线程set的value值  发现两个不一致 抛出异常。

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 23
码字总数 10836
作品 0
浦东
私信 提问
从Java内存模型角度理解安全初始化

本文将简要介绍java内存模型(JMM)的底层细节以及所提供的保障,并从JMM的角度再谈如何在并发环境下正确初始化对象,这将有助于理解更高层面的并发同步机制背后的原理。 相关阅读 1.多线程安...

登高且赋
2017/10/13
0
0
如何写出线程不安全的代码

什么是线程安全性 很多时候,我们的代码,在单线程的环境下是可以运行的非常完美,然而,一旦把代码放到多线程的环境下去接受蹂躏,结果常常是惨不忍睹的。 《Java并发编程实践》中,给出了线...

SexyCode
01/02
0
0
JAVA并发-自问自答学ThreadLocal

前言 很多同学都搞不懂是什么东西,可以用来干嘛。但面试时却又经常问到,所以这次我和大家一起学习这个类。 下面我就以面试问答的形式学习我们的——类(源码分析基于JDK8) 本文同步发布于...

liangzzz
2017/11/17
0
0
并发实战 之「 对象的共享及组合」

版权声明:Follow your heart and intuition. https://blog.csdn.net/qq_35246620/article/details/83443910 温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,...

维C果糖
10/27
0
0
GoFrame v0.99.682 beta 发布,更强大的 Go Web 框架

GoFrame v0.99.682 beta 发布了。GF(Go Frame)是一款模块化、松耦合、轻量级、高性能的Go语言Web开发框架。支持热重启、热更新、多域名、多端口、多服务、HTTP/HTTPS、动态路由等特性,并提供...

johng-cn
08/06
1K
9

没有更多内容

加载失败,请刷新页面

加载更多

PHP生成CSV之内部换行

当我们使用PHP将采集到的文件内容保存到csv文件时,往往需要将采集内容进行二次过滤处理才能得到需要的内容。比如网页中的换行符,空格符等等。 对于空格等处理起来都比较简单,这里我们单独...

豆花饭烧土豆
12分钟前
0
0
使用 mjml 生成 thymeleaf 邮件框架模板

发邮件算是系统开发的一个基本需求了,不过搞邮件模板实在是件恶心事,估计搞过的同仁都有体会。 得支持多种客户端 支持响应式 疼彻心扉的 outlook 多数客户端只支持 inline 形式的 css 布局...

郁也风
15分钟前
2
0
让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字

让哲学照亮我们的人生——读《医务工作者需要学点哲学》有感2600字: 作者:孙冬梅;以前读韩国前总统朴槿惠的著作《绝望锻炼了我》时,里面有一句话令我印象深刻,她说“在我最困难的时期,...

原创小博客
今天
3
0
JAVA-四元数类

public class Quaternion { private final double x0, x1, x2, x3; // 四元数构造函数 public Quaternion(double x0, double x1, double x2, double x3) { this.x0 = ......

Pulsar-V
今天
17
0
Xshell利用Xftp传输文件,使用pure-ftpd搭建ftp服务

Xftp传输文件 如果已经通过Xshell登录到服务器,此时可以使用快捷键ctrl+alt+f 打开Xftp并展示Xshell当前的目录,之后直接拖拽传输文件即可。 pure-ftpd搭建ftp服务 pure-ftpd要比vsftp简单,...

野雪球
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部