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

一段有趣的并发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并发编程中的技巧,通过一系列逐步进阶的代码实例,帮助你掌握从基础到高级的并发概念。 首先,我们从“线程安全”开始。线程安全是指在多线程环境下,一个类或方法能够正确地处理并发...

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

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

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

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

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

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

    Java高并发学习代码

    Java高并发学习代码

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

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

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

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

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

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

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

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

    java高并发买秒杀完整代码

    本文将围绕“Java高并发秒杀完整代码”这一主题,结合描述中提到的技术栈,如Spring、SpringMVC、MyBatis、Bootstrap、JavaScript、Redis以及MySQL和存储过程,来详细讲解如何构建一个能够应对大量并发请求的秒杀...

    在IntelliJ IDEA中多线程并发代码的调试方法详解

    多线程并发代码的调试方法详解 在多线程并发编程中,调试是一件很复杂的事情,特别是在使用 IntelliJ IDEA 等集成开发环境时。今天,我们将详细介绍如何在 IntelliJ IDEA 中调试多线程并发代码。 在多线程并发编程...

    c# 各种并发执行代码及性能分析

    c# 各种并发执行代码及性能分析,多线程

    尚硅谷大厂必备技术之JUC并发编程基础视频 配套资料(自己根据视频整理课件,和代码)

    【尚硅谷】大厂必备技术之JUC并发编程视频 配套资料,自己根据视频整理 pdf 课件,和代码 视频地址:...

    Java并发编程代码.7z

    这个压缩包"Java并发编程代码.7z"很可能包含了一系列示例代码,用于演示和解释Java并发编程的关键概念和技术。下面我们将深入探讨Java并发编程的相关知识点。 1. **线程与进程**:在Java中,线程是程序执行的基本...

    并发编程代码

    以下是对"并发编程代码"这一主题的详细解释: 1. **线程与进程**:在并发编程中,线程是程序执行的基本单元,而进程则是资源分配的基本单位。一个进程中可以有多个线程,它们共享同一内存空间,互相之间可以直接...

    并发模拟程序

    如有疑问,请结合博客:...本代码为演示并发所创,本代码为演示并发所创,本代码为演示并发所创,本代码为演示并发所创,本代码为演示并发所创,本代码为演示并发所创,本代码为演示并发所创,本代码为演示并发所创,

Global site tag (gtag.js) - Google Analytics