文档章节

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

 骑着乌龟赛跑
发布于 2015/08/27 09:43
字数 208
阅读 28
收藏 0
点赞 0
评论 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
博文 22
码字总数 10836
作品 0
浦东
从Java内存模型角度理解安全初始化

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

登高且赋 ⋅ 2017/10/13 ⋅ 0

如何写出线程不安全的代码

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

SexyCode ⋅ 01/02 ⋅ 0

JAVA并发-自问自答学ThreadLocal

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

liangzzz ⋅ 2017/11/17 ⋅ 0

Java并发编程注意事项

保证线程安全的三种方法: 一开始就将类设计成线程安全的, 比在后期重新修复它,更容易. 编写多线程程序, 首先保证它是正确的, 其次再考虑性能. 无状态或只读对象永远是线程安全的. 不要将一个...

candies ⋅ 2014/02/22 ⋅ 0

java并发编程(二): 对象的共享

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

ihaolin ⋅ 2014/03/23 ⋅ 1

对象共享:Java并发环境中的烦心事

相关文章: 多线程安全性:每个人都在谈,但是不是每个人都谈地清 并发的意义在于多线程协作完成某项任务,而线程的协作就不可避免地需要共享数据。今天我们就来讨论下如何发布和共享类对象,...

登高且赋 ⋅ 2017/09/28 ⋅ 0

JAVA并发-自问自答学ThreadLocal

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

liangzzz ⋅ 2017/11/17 ⋅ 0

java并发编程实践之安全发布和逸出

前言 多线程并发环境下,线程安全极为重要。往往一些问题的发生都是由于不正确的发布了对象造成了对象逸出而引起的,因此如果系统开发中需要发布一些对象,必须要做到安全发布,以免造成安全...

我类个擦 ⋅ 2013/09/27 ⋅ 1

Java并发编程实战——基础知识

Java并发编程实战——基础知识 某学姐2017-02-2813 阅读 学姐最近在重读Java并发编程实战这本书。本文是关于第一部分的知识点总结。 主要涉及如下知识点: 线程安全性(无状态对象) 原子性(...

某学姐 ⋅ 2017/02/28 ⋅ 0

八年磨一剑,Python Web 框架 Flask 1.0 正式发布

Flask 1.0 已正式发布,Flask 是一个微型的 Python 开发的 Web 框架,最初构建于 2010 年,至今已发展 8 年。 示例代码: from flask import Flaskapp = Flask(name)@app.route("/")def hel...

王练 ⋅ 04/27 ⋅ 2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

x64: TITLE Add and Subtract (AddSub.asm) ; This program adds and subtracts 32-bit integers. ; Last update: 2/1/02 ;.MODEL flat,stdcall x64 not su......

simpower ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

Java对象的序列化与反序列化

Java对象的序列化与反序列化

Cobbage ⋅ 昨天 ⋅ 0

Sqoop

1.Sqoop: 《=》 SQL to Hadoop 背景 1)场景:数据在RDBMS中,我们如何使用Hive或者Hadoop来进行数据分析呢? 1) RDBMS ==> Hadoop(广义) 2) Hadoop ==> RDBMS 2)原来可以通过MapReduce I...

GordonNemo ⋅ 昨天 ⋅ 0

全量构建和增量构建的区别

1.全量构建每次更新时都需要更新整个数据集,增量构建只对需要更新的时间范围进行更新,所以计算量会较小。 2.全量构建查询时不需要合并不同Segment,增量构建查询时需要合并不同Segment的结...

无精疯 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部