`
cloudeagle_bupt
  • 浏览: 579090 次
文章分类
社区版块
存档分类
最新评论

ConcurrencyHashMap线程不安全的代码示例

 
阅读更多
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#线程安全的源代码示例

    本项目提供了一系列的源代码示例,帮助开发者理解和实现线程安全。 首先,理解线程安全的核心在于避免竞态条件和死锁。竞态条件是指当两个或更多线程可以无序地访问共享数据时,结果的正确性依赖于线程执行的顺序,...

    c#多线程计算源代码示例

    本文将深入探讨如何在C#中实现多线程,并通过一个简单的源代码示例进行讲解。 首先,我们要理解多线程的基本概念。在单线程程序中,执行任务是顺序的,而多线程允许程序同时执行多个任务,提高了计算机资源的利用率...

    多线程编程示例

    4. **线程安全**:如果一个方法或数据结构在多线程环境下能正确工作,我们就称其为线程安全。线程安全可以通过设计、同步机制或使用线程安全的数据结构来实现。 在实践中,多线程编程还需要关注性能和资源消耗,...

    C#多线程控件安全调用示例

    然而,多线程环境下的控制台控件操作必须谨慎进行,因为不同线程间的交互可能导致数据不一致或者线程安全问题。本示例将深入探讨如何在C#中安全地在多线程环境中调用控件,以确保程序的稳定性和正确性。 首先,了解...

    C++线程安全队列_示例代码.zip

    【C++ 语言】线程安全队列 ( 条件变量 | 线程调度 ) : https://hanshuliang.blog.csdn.net/article/details/102851323 下载完项目后 , 使用 Visual Studio 打开 , 注意需要配置 POSIX 线程库 ( 参考以下博客配置...

    c# 线程安全队列的用法原理及使用示例

    在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 在多线程并行的情况下会出现共享数据会线程间读取与写入不一直的情况...

    Java线程之程安全与不安全代码示例

    Java线程安全与不安全代码示例 在Java编程中,线程安全是一个非常重要的概念,毕竟Java是一门面向对象的编程语言,多线程编程是其一个非常重要的特性。那么什么是线程安全?线程安全指的是在多线程环境下,程序能够...

    浅谈C#跨线程调用窗体控件(比如TextBox)引发的线程安全问题

    C#跨线程调用窗体控件时可能会引发线程安全问题,例如当多个线程操作同一个控件时,该控件可能会进入不一致的状态,出现争用情况和死锁等问题。因此,确保以线程安全方式访问控件非常重要。 在C#中,控件并不是线程...

    线程示例代码

    本示例代码主要探讨如何在Linux环境下创建和管理线程,以达到高效的多任务处理。 线程是操作系统分配处理器时间的基本单元,一个进程可以包含一个或多个线程。与创建新进程相比,线程的创建和销毁成本较低,因为...

    POSIX规范多线程代码示例

    在这个名为"POSIX规范多线程代码示例"的压缩包中,你将找到六个使用C++的POSIX线程库(pthread)编写的示例,它们逐步展示了如何在Linux和Windows环境下(使用Visual Studio,需添加-lpthread链接选项)创建和管理多...

    多线程代码示例

    在标题“多线程代码示例”中,我们聚焦于通过编程实现多线程的实例。描述简洁明了,暗示我们将讨论如何在实际代码中运用多线程。 多线程的概念源于操作系统中的并发执行机制,它允许多个任务或子任务在单个处理器上...

    关于c#多线程示例

    本示例将深入探讨C#中的多线程实现方法、应用场景以及常见问题。 1. **线程的创建** 在C#中,可以使用`System.Threading`命名空间中的`Thread`类来创建线程。创建新线程的基本步骤是: - 创建一个`Thread`对象...

    CVI 线程锁、线程安全变量实例

    在LabWindows/CVI的`多线程_线程锁_线程安全变量`示例中,你可能会发现以下几个关键点: 1. **线程创建与销毁**:使用`cvCreateThread()` 创建线程,并通过`cvExitThread()` 结束线程。 2. **线程锁的使用**:在...

    使用互斥进行线程同步代码示例 Thread3_23.zip_互斥_线程同步

    在"Thread3_23.zip"中,我们可以期待看到一个使用互斥锁的C++或C#代码示例,它展示了如何在多线程环境中控制对共享数据的访问。通常,一个线程会先尝试获取锁,如果成功,就进入临界区(Critical Section),执行...

    MFC多线程完整总结及示例代码

    MFC 多线程完整总结及示例代码 多线程是一种重要的编程技术,用于实现并行处理和提高系统性能。在 MFC 中,多线程编程可以通过 Win32 API 函数和 MFC 类库来实现。在本文中,我们将对多线程的基本概念、多线程编程...

    跨线程调用控件示例

    特别是在使用如C#这样的多线程语言时,由于UI(用户界面)控件通常由主线程管理,因此直接在其他线程中修改这些控件可能会导致线程安全问题,即所谓的“线程不安全访问”。本示例主要探讨如何正确地在不同线程之间...

    win32多线程程序设计 书中示例代码

    在《win32多线程程序设计》一书中,侯捷先生将详细讲解这些概念,并通过实际的代码示例(如`multiThreading_demo`中的代码)帮助读者理解和掌握Win32平台下的多线程编程。这本书对于想要提升Windows系统下多线程编程...

    Java 多线程 订票 示例 线程安全

    然而,多线程环境下的数据共享和操作可能会引发线程安全问题,如果不正确处理,可能导致数据不一致、程序崩溃等严重后果。本示例将探讨如何在Java中实现一个线程安全的订票系统。 首先,我们要理解什么是线程安全。...

    Python线程安全编程:策略、实践与代码示例

    在多线程编程中,线程安全是一个核心议题,它关乎程序的正确性和稳定性。线程安全问题通常发生在多个线程访问和修改共享数据时,...本文将深入探讨Python中处理线程安全问题的策略和实践,并通过代码示例进行详细说明。

    SurfaceView线程绘图代码示例

    内容是一段关于SurfaceView线程绘图代码示例, 也是个简单的示例,只力求把流程展示清楚。 SurfaceHolder holder; public MyView(Context context) { super(context); holder = this.getHolder(); //获取holder ...

Global site tag (gtag.js) - Google Analytics