文档章节

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

 骑着乌龟赛跑
发布于 2015/08/27 09:43
字数 208
阅读 29
收藏 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
java并发编程(二): 对象的共享

对象的共享: 要编写并发程序,关键在于:在访问共享的可变状态时需要进行正确的管理 可见性: /** 可见性问题导致,程序运行结果不正确 有可能由于编译器,处理器及运行时做一些重排序 */pu...

ihaolin
2014/03/23
0
1
GoFrame v0.99.682 beta 发布,更强大的 Go Web 框架

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

johng-cn
08/07
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

python3.6 取整除法

python3.6 中取整除法运算逻辑如下: d 非零,那么商 q 满足这样的关系: a = qd + r ,且0 ≤ r n1=7//3#7 = 3*2 +1n2=-6.1//3#-7 = 3*(-3)+2'{},{}'.format(n1,n2) 从运行结果可以...

colinux
20分钟前
3
0
阶段总结——用虚拟机搭建一个高可用负载均衡集群架构

[toc] linux基本知识已经介绍完,现有一个业务需要操作,通过对这个项目的操作,可以复习、总结、巩固之前的知识点; ** 用13台虚拟机搭建一个高可用负载均衡集群架构出来,并运行三个站点,...

feng-01
24分钟前
0
0
mysql 设置utf8字符集 (CentOS)

1.查看数据库及mysql应用目前使用的编码方式 (1)链接mysql 客户端 (2)执行:status 结果: 2.修改mysql 应用的字符编码(server characterset ) (1)打开配置文件:vim /etc/mysql/my...

qimh
24分钟前
0
0
windows无法格式化u盘解决方法

1。点开始-运行-输入cmd-format f: /fs: fat32 (这里f:是指U盘所在盘符) 这个格式化会很慢 请耐心等待

大灰狼wow
35分钟前
0
0
MySql 8.0连接失败

原来,MySql 8.0.11 换了新的身份验证插件(caching_sha2_password), 原来的身份验证插件为(mysql_native_password)。而客户端工具Navicat Premium12 中找不到新的身份验证插件(caching_s...

放飞E梦想O
52分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部