一、使用的技术

HashMap

ConcurrentHashMap

Lock

ReadWriteLock

synchronized

二、一百万并发下的组合

ConcurrentLockMap

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package cn.edu.scau.mk.map;import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/**** @author MK*/
public class ConcurrentLockMap implements In {ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();Lock lock = new ReentrantLock();@Overridepublic void add(int a) {lock.lock();try {if (map.containsKey(a)) {map.put(a, 1 + map.get(a));} else {map.put(a, 1);}} finally {lock.unlock();}}@Overridepublic int get(int a) {int as = map.get(a);return as;}}

View Code

ConcurrentSynchronizedMap

package cn.edu.scau.mk.map;import java.util.concurrent.ConcurrentHashMap;/**** @author MK*/
public class ConcurrentSynchronizedMap implements In {ConcurrentHashMap<Integer, Integer> map = new ConcurrentHashMap<>();@Overridepublic void add(int a) {synchronized ((""+a).intern()) {if (map.containsKey(a)) {map.put(a, 1 + map.get(a));} else {map.put(a, 1);}}}@Overridepublic int get(int a) {int as = map.get(a);return as;}}

View Code

LockHashMap

package cn.edu.scau.mk.map;import java.util.HashMap;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/**** @author MK*/
public class LockHashMap implements In {HashMap<Integer, Integer> map = new HashMap<>();Lock lock = new ReentrantLock();@Overridepublic void add(int a) {lock.lock();try {if (map.containsKey(a)) {map.put(a, 1 + map.get(a));} else {map.put(a, 1);}} finally {lock.unlock();}}@Overridepublic int get(int a) {int as = 0;lock.lock();try {map.get(a);} finally {lock.unlock();}return as;}}

View Code

ReadWriteHashMap

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package cn.edu.scau.mk.map;import java.util.HashMap;
import java.util.concurrent.locks.ReentrantReadWriteLock;/**** @author MK*/
public class ReadWriteHashMap implements In {HashMap<Integer, Integer> map = new HashMap<>();ReentrantReadWriteLock lock = new ReentrantReadWriteLock();//390
@Overridepublic void add(int a) {lock.writeLock().lock();try {if (map.containsKey(a)) {map.put(a, 1 + map.get(a));} else {map.put(a, 1);}} finally {lock.writeLock().unlock();}}@Overridepublic int get(int a) {int as = 0;lock.readLock().lock();try {as = map.get(a);} finally {lock.readLock().unlock();}return as;}}

View Code

SynchronizedHashMap

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package cn.edu.scau.mk.map;import java.util.HashMap;/**** @author MK*/
public class SynchronizedHashMap implements In {HashMap<Integer, Integer> map = new HashMap<>();@Overridepublic synchronized void add(int a) {if (map.containsKey(a)) {map.put(a, 1 + map.get(a));} else {map.put(a, 1);}}@Overridepublic synchronized int get(int a) {int as = map.get(a);return as;}}

View Code

In

package cn.edu.scau.mk.map;/**** @author MK*/
public interface In {void add(int a);int get(int a);}

View Code

Adder

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package cn.edu.scau.mk.map;import java.util.Random;/**** @author MK*/
public class Adder implements Runnable {In in;Random random = new Random();public Adder(In in) {this.in=in;}@Overridepublic void run() {for (int i = 0; i < 1000; i++) {//in.add(random.nextInt());
            in.add(i);}}
}

View Code

Getter

/** To change this license header, choose License Headers in Project Properties.* To change this template file, choose Tools | Templates* and open the template in the editor.*/
package cn.edu.scau.mk.map;import java.util.Random;/**** @author MK*/
public class Getter implements Runnable {In in;Random random = new Random();public Getter(In in) {this.in=in;}@Overridepublic void run() {for (int i = 0; i < 1000; i++) {//in.add(random.nextInt());
            in.get(i);}}
}

View Code

TestDemo

package cn.edu.scau.mk.map;import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;/**** @author MK*/
public class TestDemo {public static void main(String[] args) {In in = null;in = new ReadWriteHashMap();operate(in);in = new ConcurrentSynchronizedMap();operate(in);in = new ConcurrentLockMap();operate(in);in = new SynchronizedHashMap();operate(in);in = new LockHashMap();operate(in);}public static void operate(In in) {int poolSize = 1000000;Adder add = new Adder(in);ThreadPoolExecutor threadPool = (ThreadPoolExecutor) Executors.newCachedThreadPool();long start = System.currentTimeMillis();for (int i = 0; i < poolSize; i++) {threadPool.execute(add);}System.out.println(threadPool.getActiveCount());threadPool.shutdown();try {//等待直到所有任务完成
            threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);long end = System.currentTimeMillis() - start;System.out.print(in.getClass().getSimpleName()+" add:" + end);} catch (InterruptedException e) {e.printStackTrace();}Getter get = new Getter(in);threadPool = (ThreadPoolExecutor) Executors.newCachedThreadPool();start = System.currentTimeMillis();for (int i = 0; i < poolSize; i++) {threadPool.execute(add);}threadPool.shutdown();try {//等待直到所有任务完成
            threadPool.awaitTermination(Long.MAX_VALUE, TimeUnit.MINUTES);long end = System.currentTimeMillis() - start;System.out.println(" get:" + end);} catch (InterruptedException e) {e.printStackTrace();}}
}

View Code

三、输出结果

(1)一万并发

6642
ReadWriteHashMap add:1263 get:983
7
ConcurrentSynchronizedMap add:577 get:546
7373
ConcurrentLockMap add:1515 get:1731
7783
SynchronizedHashMap add:1810 get:1607
6632
LockHashMap add:1092 get:1029

(2)十万并发

58095
ReadWriteHashMap add:149181 get:69606
1443
ConcurrentSynchronizedMap add:5678 get:6631
54623
ConcurrentLockMap add:84595 get:77182
48390
SynchronizedHashMap add:63958 get:64696
49078
LockHashMap add:64606 get:64364

(3)百万并发

681252
ReadWriteHashMap add:215943 get:85792
25145
ConcurrentSynchronizedMap add:80593 get:76485
546230
ConcurrentLockMap add:912461 get:821907
636318
SynchronizedHashMap add:845893 get:850142
500129
LockHashMap add:792271 get:808326

Java 高并发下的实践相关推荐

  1. java高并发下数据入库

    java高并发下数据入库 该服务利用线程池并结合缓存类来处理高并发下数据入库问题,做到实时数据存入redis和数据批量入库,使用的时候需要修改为自己的业务数据,该模块是根据下面的设置进行高并发处理. ...

  2. java高并发下的数据安全

    高并发下的数据安全 我们知道在多线程写入同一个文件的时候,会存现"线程安全"的问题(多个线程同时运行同一段代码,如果每次运行结果和单线程运行的结果是一样的,结果和预期相同,就是线程 ...

  3. 高级JAVA - 高并发下接口限流 Semaphore

    Semaphore的介绍 Semaphore, 是JDK1.5的java.util.concurrent并发包中提供的一个并发工具类 Semaphore字面意思即信号量 , 个人认为比较容易理解的说法 ...

  4. java如何保证数据安全_java高并发下怎么保障数据安全?有哪些办法?

    近些年科技发展水平越来越快速了,这也促使了大家对于新兴软件的学习.尤其是对于java的渴求更是明显,这也进一步说明了java功能的强大.今天就来为大家介绍一下java高并发下怎么保障数据安全以及有哪些 ...

  5. 1000+Redis实例,100+集群,Redis 在海量数据和高并发下的优化实践

    墨墨导读:Redis 对于从事互联网技术工程师来说并不陌生,几乎所有的大中型企业都在使用 Redis 作为缓存数据库. 但是对于绝大多数企业来说只会用到它的最基础的 KV 缓存功能,还有很多 Redi ...

  6. 钱文品 | 《Redis在海量数据和高并发下的优化实践》主题分享

    原文:http://www.enmotech.com/web/detail/1/750/1.html 导读:Redis 对于从事互联网技术工程师来说并不陌生,几乎所有的大中型企业都在使用 Redis ...

  7. java list 转 map_高并发下的Java数据结构(List、Set、Map、Queue)

    由于并行程序与串行程序的不同特点,适用于串行程序的一些数据结构可能无法直接在并发环境下正常工作,这是因为这些数据结构不是线程安全的.本节将着重介绍一些可以用于多线程环境的数据结构,如并发List.并发 ...

  8. Java多线程学习二十七:AtomicInteger 在高并发下性能不好,如何解决?为什么?

    AtomicInteger 在高并发下性能不好,如何解决?以及为什么会出现这种情况? 我们知道在 JDK1.5 中新增了并发情况下使用的 Integer/Long 所对应的原子类 AtomicInte ...

  9. Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解

    说明:Java生鲜电商平台-生鲜电商高并发下的接口幂等性实现与代码讲解,实际系统中有很多操作,是不管做多少次,都应该产生一样的效果或返回一样的结果.例如: 前端重复提交选中的数据,应该后台只产生对应这 ...

最新文章

  1. android同时使用多个library时的问题
  2. leftjoin及多个leftjoin执行顺序
  3. ITK:将数组转换为图像
  4. 【bug记录】android:Program type already present: android.support.v4.app.INotificationSideChannel
  5. js贪心算法---背包问题
  6. day28 socket网络编程
  7. 数据结构之DFS与BFS实现
  8. golang mysql加锁_使用golang实现类InnoDB数据行锁效果
  9. Web Hacking 101 中文版 十、跨站脚本攻击(二)
  10. 设置一行五个图标_如何解决苹果电脑 Launchpad 图标过大或者过小的问题?
  11. RestTemplate HttpMessageConverter报错的解决方案no suitable HttpMessageConverter
  12. Rust: 如何与DLL文件进行交互?
  13. 【win10专业版】ultraiso如何制作光盘启动盘
  14. 翻新iPad可以购买吗?有什么需要注意的地方
  15. Windows下批量删除空文件夹
  16. 【DockerCE】RHEL 7.9完整安装DockerCE 20.10.5的包集合
  17. 快速提高点击率的办法
  18. C# winform跨线程操作控件
  19. jq 手风琴折叠菜单 js滚动效果 collapse.js slideUp()
  20. 购买服务器并设置Nginx

热门文章

  1. [C++STL]map容器用法介绍
  2. C++string容器应用举例
  3. 算法-排序-插入排序
  4. html自定义鼠标右键,js自定义鼠标右键的实现原理及源码
  5. 查询ecshop网站代码排查方法_提升网站访问速度,提升网站访问速度,提升网站访问速度的个人经验分享...
  6. libjpeg: cannot open
  7. Caffe 增加自定义 Layer 及其 ProtoBuffer 参数
  8. Java -- 泛型
  9. Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组
  10. P2596 [ZJOI2006]书架 无旋treap 按照排名分裂