package prefetch;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hama.graph.GraphJobMessage;
import org.apache.hama.util.WritableUtils;
public class ConcurrencyTest {
public ConcurrentHashMap<WritableComparable, GraphJobMessage> storage = new ConcurrentHashMap<WritableComparable, GraphJobMessage>();
public ConcurrencyTest() {
}
// 测试多线程写入会冲掉的问题
public static void main(String[] args) {
try {
ConcurrencyTest chmt = new ConcurrencyTest() ;
MessageProdcer mg1 = new MessageProdcer(chmt) ;
Thread t1 = new Thread(mg1) ;
MessageProdcer mg2 = new MessageProdcer(chmt) ;
Thread t2 = new Thread(mg2) ; //启动两个生产者线程
t1.start() ;
// t2.start() ;
Thread.sleep(1000) ;
while(true) {
if(!t1.isAlive()) {
t2.start() ;
break ;
}
}
t1.join() ;
t2.join() ;
System.out.println("storage size: " + chmt.storage.size());
for(Map.Entry<WritableComparable, GraphJobMessage> e : chmt.storage.entrySet())
System.out.println("Key: " + e.getKey() + " Value Size: " + e.getValue().getNumOfValues()) ;
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
public void add(GraphJobMessage item) {
<pre name="code" class="java">if (!storage.containsKey(item.getVertexId())) {
storage.putIfAbsent(item.getVertexId(), item);
} else {
storage.get(item.getVertexId()).addValuesBytes(
item.getValuesBytes(), item.size());
}
上述代码,执行3次,结果始终为:
storage size: 1Key: 5 Value Size: 200000
但是将这段修改为:
t2.start() ;
// Thread.sleep(1000) ;
// while(true) {
// if(!t1.isAlive()) {
// t2.start() ;
// break ;
// }
// }
结果变为:
storage size: 1
Key: 5 Value Size: 199999
storage size: 1
Key: 5 Value Size: 200000
storage size: 1
Key: 5 Value Size: 199998
可见这段代码存在并发安全问题:
public void add(GraphJobMessage item) {
if (!storage.containsKey(item.getVertexId())) {
storage.putIfAbsent(item.getVertexId(), item);
} else {
storage.get(item.getVertexId()).addValuesBytes(
item.getValuesBytes(), item.size());
}
}
可见ConcurrencyHashMap也 不是绝对安全的,要看实际情况
分享到:
相关推荐
这是一个源代码项目,通过很明了的代码来向大家诠释什么叫做线程安全,怎样才能达到线程安全,已经怎样去避免非线程安全问题
多线程 控件 安全 调用 示例 C# 环境vs2008
【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 ) : https://hanshuliang.blog.csdn.net/article/details/102851323 下载完项目后 , 使用 Visual Studio 打开 , 注意需要配置 POSIX 线程库 ( 参考以下博客配置...
mysql是线程不安全的,mysql不是线程安全的,多线程共用同一个mysql连接是会崩溃的 QT的QSqlDatabase是基于mysql的,所以一样是线程不安全的 现讲明mysql为什么是线程不安全的,以及在多线程环境下如何使用mysql,...
一个多线程计算的小例子 源代码规范,注释清楚 是c#基础学习的好素材
多线程代码示例
简单多线程编程入门,可以帮助你实现第一个多线程程序
内容简介:线程与进程相似,是一段完成某个特定功能的代码,是程序中单个顺序的流控制;但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一...
HashMap为什么是线程不安全的?如何解决HashMap的线程不安全问题?
主要介绍了Java线程之程安全与不安全代码示例,还是比较不错的,这里分享给大家,供需要的朋友参考。
在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 在多线程并行的情况下会出现共享数据会线程间读取与写入不一直的情况...
主要介绍了生产消费者模式实现方式和线程安全问题代码示例,具有一定借鉴价值,需要的朋友可以参考下
线程源代码线程源代码线程源代码线程源代码线程源代码线程源代码线程源代码线程源代码线程源代码线程源代码线程源代码
内容是一段关于SurfaceView线程绘图代码示例, 也是个简单的示例,只力求把流程展示清楚。 SurfaceHolder holder; public MyView(Context context) { super(context); holder = this.getHolder(); //获取holder ...
JAVA 多线程的PPT和示例 JAVA 多线程的PPT和示例 JAVA 多线程的PPT和示例
深入浅出java多线程代码示例,由简单到复杂,代码示例,供参考学习
内容概要:Java线程间通信的代码示例 适用人群:Java 使用场景:Java线程间交换数据 目标:通过本资源示例,深刻理解线程间通讯的基本原理和实现方法,解决工作中实际问题。
Java 多线程 订票 示例 线程安全 Demo 例子 经典
Java中懒汉单例设计模式线程安全测试,单例设计模式的测试
关于c#多线程示例