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;
}
}
}
}
一边生产,一边消费,性能不佳啊!
分享到:
相关推荐
编写正确的程序很难,而编写正确的并发程序则难上加难。与串行程序相比,在并发程序中...同时在当今互联网的时代,大量的互联网应用都面对着海量的访问请求,因此,并发编程在我们的应用中成为越来越不可或缺的一部分。
操作系统实验一 多进程并发执行的实验报告的代码
linux下完整的epoll多线程高并发服务器代码
Java 高并发多线程编程系列案例代码 & 教程 & 面试题集锦! !! 包括但不限于线程安全性, atomic包下相关类、CAS原理、Unsafe类、synchronized关键字等的使用及注意事项,
Java高并发编程代码(Netty NIO 实例)
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 如何处理多用户更新数据并发...
java并发编程的联系代码,由低到高,包含线程安全、锁、线程通讯、线程池、Concurrent包内容的使用、各种阻塞队列的联系等知识。
Java并发编程代码. 包含所有的运行依赖库,可以直接运行,无需再去找依赖库
主要是自己学习java多线程学习的笔记记录。作为新手练手也好,作为工作三年的我,来说只是作为跳槽之前的准备,之前对于java多线程真的是一知半解,只有到这里我才发现原来是长这样的基础模型。...
并发编程代码.rar
【尚硅谷】大厂必备技术之JUC并发编程视频 配套资料,自己根据视频整理 pdf 课件,和代码 视频地址:...
Java并发编程代码.7z
并发编程代码
C++11并发编程实战源代码
面试专题--并发篇代码
JAVA并发容器代码随读1
│ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │ 高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │ 高并发编程...
基于抽象工厂设计的并发程序
go并发编程实践V2 符加两份课程源代码。深入学习go并发编程技术。