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

一段有趣的并发concurrencyhashMap代码

 
阅读更多
package concurrencyTest;

import java.util.Iterator;
import java.util.concurrent.ConcurrentHashMap;

public class ConcurrencyTest2 {

	public static Object mutex = new Object() ;
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		ConcurrentHashMap<Integer, Integer>  map = new ConcurrentHashMap<Integer, Integer>() ;
		for(int i=0;i<100000 ; i++)
			map.put(i, i+111111) ;
		
		long start = System.currentTimeMillis() ;
		Thread t1 = new Thread(new Producer(map)) ;
		Thread t2 = new Thread(new Consumer(map)) ;
		
		try {
			Thread.sleep(200) ;
			t1.start(); 
			t2.start();
			
			t1.join() ;
			t2.join();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Read last : " + (System.currentTimeMillis() - start) + " ms" + " shareMap : " + map.size());
	}
}

class Producer implements Runnable {
	ConcurrentHashMap<Integer, Integer>  sharemap ;
    int num = 0 ;
    public static volatile boolean end = false; 
	
	public Producer(ConcurrentHashMap<Integer, Integer> map) {
		sharemap = map ;
	}
	
	@Override
	public void run() {
		try {
		 int i =50000 ;
		 while(i<1000000) {
			 add(i) ;
			 i++ ;
			 if(i==120000)  
				 Thread.sleep(1000) ;
		 }
		 end = true ;	
		 System.out.println(Thread.currentThread().getName() + " add " + (i - 50000) + " elements! ShareMap size: " + sharemap.size() );
		} catch (Exception e) {
			e.printStackTrace() ;
		}
	}

	  public void add(int item) {  
		  synchronized (ConcurrencyTest2.mutex) {
			  if(!sharemap.containsKey(item)) {
				  sharemap.putIfAbsent(item, item + 111111) ;
			  } else {
				  sharemap.put(item, sharemap.get(item) + 222222) ; 
			  }
		}
	  }
}

class Consumer implements Runnable {
	ConcurrentHashMap<Integer, Integer>  sharemap ;
    int num = 0 ;
	
	public Consumer(ConcurrentHashMap<Integer, Integer> map) {
		sharemap = map ;
		it = sharemap.values().iterator();
	}
	
	@Override
	public void run() {
		 Integer i = poll(); 
		 while(!Producer.end) {
			 if((i = poll())!=null) {
				 num++ ;
			 } else {
				 it = sharemap.values().iterator();
				 System.out.println("wait poll num: " + num + " ShareMap size: "+ sharemap.size());
			 }
		 }
		 System.out.println(Thread.currentThread().getName() + " poll " + num + " elements! ShareMap size: " + sharemap.size() );
	}
	
	Iterator<Integer> it;

	public Integer poll() {
		  synchronized (ConcurrencyTest2.mutex) {
			     if (sharemap.size() > 0 && it!=null && it.hasNext()) {
			         Integer m = it.next();
			         it.remove();
			         return m;
			       } else {
			         return null;
			       }		  
		  }
	}
}



一边生产,一边消费,性能不佳啊!

分享到:
评论

相关推荐

    并发编程代码.zip

    编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。

    多进程并发执行代码

    操作系统实验一 多进程并发执行的实验报告的代码

    抽象工厂并发程序代码demo

    在这个代码示例中,可能的场景是,抽象工厂创建任务对象,并将这些任务放入一个并发队列中。然后,多个工作线程可以从队列中取出任务进行执行。这种方式可以有效地利用多核处理器的并行计算能力,提高程序的运行效率...

    epoll多线程高并发服务器代码

    linux下完整的epoll多线程高并发服务器代码

    Java并发编程进阶练习代码

    本练习集专注于提升你在Java并发编程中的技巧,通过一系列逐步进阶的代码实例,帮助你掌握从基础到高级的并发概念。 首先,我们从“线程安全”开始。线程安全是指在多线程环境下,一个类或方法能够正确地处理并发...

    Java并发编程代码(包含运行依赖库)

    线程安全意味着多个线程访问同一段代码时,不会导致数据的不一致。为了实现线程安全,开发者需要关注共享状态的访问控制,如`synchronized`关键字可以确保同一时刻只有一个线程执行特定代码块。 2. **volatile...

    Go-有趣的Go代码的语料库

    "有趣的Go代码的语料库"是一个集合,包含了各种创新和巧妙的Go语言编程示例,旨在帮助开发者拓宽视野,提升Go编程技巧。 这个语料库可能包括了各种不同的Go代码片段,涵盖了诸如错误处理、类型系统、反射...

    gRPC并发性能测试代码

    JAR文件内包含了编译后的Java代码,这些代码可能包含了gRPC客户端和/或服务器的实现,以及并发测试逻辑。使用Java编写gRPC服务的好处在于可以利用Java的多线程机制来实现并发请求。 5. **grpc-java.rar**:这是一个...

    Java高并发编程代码(Netty NIO 实例)

    Java高并发编程是现代软件开发中的重要组成部分,特别是在构建大规模、高性能的应用系统时,如分布式服务、实时聊天、在线游戏等。Netty是一款强大的、高性能的网络应用框架,它基于Java NIO(非阻塞I/O)设计,为...

    实战JAVA高并发程序设计源代码汇总版

    《实战JAVA高并发程序设计源代码汇总版》是针对JAVA并发编程领域的一份宝贵资源,它集合了《实战JAVA高并发程序设计》一书中的核心示例代码,旨在帮助开发者深入理解和实践JAVA并发编程的关键技术。这个压缩包包含了...

    Java 高并发多线程编程系列案例代码

    Java 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,

    Java高并发学习代码

    Java高并发学习代码

    《Java并发编程的艺术》源代码

    Java并发编程的艺术 作者:方腾飞 魏鹏 程晓明 著 丛书名:Java核心技术系列 出版日期 :2015-07-25 ISBN:978-7-111-50824-3 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何...

    Visual C++源代码 147 如何处理多用户更新数据并发问题

    Visual C++源代码 147 如何处理多用户更新数据并发问题Visual C++源代码 147 如何处理多用户更新数据并发问题Visual C++源代码 147 如何处理多用户更新数据并发问题Visual C++源代码 147 如何处理多用户更新数据并发...

    go并发编程实践V2+源代码

    在这个"Go并发编程实践V2"的课程中,我们将深入探讨Go语言中的并发编程,并结合源代码来理解其工作原理。 并发编程是现代软件开发中的一个重要概念,它允许程序同时执行多个任务,从而提高系统的效率和响应性。Go...

    并发编程代码.rar

    synchronized提供锁机制,确保同一时刻只有一个线程执行特定代码段;volatile确保变量的可见性和有序性;Lock提供了更细粒度的控制,如可重入性、公平性选择;Atomic类提供了原子操作,保证多线程环境下的数据一致性...

    java并发编程实战源码,java并发编程实战pdf,Java

    《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...

    java并发编程代码.7z

    主要是自己学习java多线程学习的笔记记录。作为新手练手也好,作为工作三年的我,来说只是作为跳槽之前的准备,之前对于java多线程真的是一知半解,只有到这里我才发现原来是长这样的基础模型。...

    实战Java高并发程序设计-随书代码

    《实战Java高并发程序设计》是一本专注于Java并发编程实践的书籍,随书代码提供了大量示例,帮助读者深入理解并掌握在实际开发中如何处理高并发场景下的问题。本书的核心知识点涵盖了Java并发编程的基础理论、核心...

    《Java7并发编程实战手册》书中实例代码

    《Java 7并发编程实战手册》是一本深入探讨Java并发编程的权威著作,它涵盖了大量实用的技巧和最佳实践,旨在帮助开发者在多线程环境下编写高效、安全的代码。这本书的实例代码提供了丰富的示例,使读者能够直观地...

Global site tag (gtag.js) - Google Analytics