ConcurrentMap线程安全的正确用法
来源:互联网 发布:算法makeheap运算 编辑:程序博客网 时间:2024/05/22 16:20
import java.util.HashMap;import java.util.Map;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.ConcurrentMap;import java.util.concurrent.ExecutionException;public class ConcurrentMapWithMap { private static Map<String, Long> mapWordCounts = new HashMap<>(); private static ConcurrentMap<String, Long> concurrentMapWordCounts = new ConcurrentHashMap<>(); public static int count=0; public static long mapIncrease(String word) { Long oldValue = mapWordCounts.get(word); Long newValue = (oldValue == null) ? 1L : oldValue + 1; mapWordCounts.put(word, newValue); return newValue; } public static long ConcurrentMapIncrease(String word) { Long oldValue, newValue; while (true) { oldValue = concurrentMapWordCounts.get(word); if (oldValue == null) { newValue = 1L; //已经有key了就返回放入的值,否则返回空 if (concurrentMapWordCounts.putIfAbsent(word, newValue) == null) { break; } } else { newValue = oldValue + 1; //值替换,每次替换时都会比较上面拿到oldValue是否就是当前map里面的值,是才替换,否则继续获取 if (concurrentMapWordCounts.replace(word, oldValue, newValue)) { break; } } } return newValue; } public static void mapWordCount() throws InterruptedException, ExecutionException { new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ConcurrentMapWithMap.mapIncrease("work"); } }).start(); new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ; ConcurrentMapWithMap.mapIncrease("work"); } }).start(); new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ConcurrentMapWithMap.mapIncrease("work"); } }).start(); new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ConcurrentMapWithMap.mapIncrease("work"); } }).start(); } public static void concurrentWordCount() throws InterruptedException, ExecutionException { new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ConcurrentMapWithMap.ConcurrentMapIncrease("work"); } }).start(); new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ConcurrentMapWithMap.ConcurrentMapIncrease("work"); } }).start(); new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ConcurrentMapWithMap.ConcurrentMapIncrease("work"); } }).start(); new Thread(new Runnable(){ public void run() { int count=0; while(count++<10000) ConcurrentMapWithMap.ConcurrentMapIncrease("work"); } }).start(); } public static void main(String[] args) throws InterruptedException, ExecutionException { ConcurrentMapWithMap.mapWordCount(); Thread.sleep(10000); System.out.println("final count map"+ConcurrentMapWithMap.mapWordCounts.get("work"));//多线程累加,每次都少于40000,故线程不安全 ConcurrentMapWithMap.concurrentWordCount(); Thread.sleep(10000); System.out.println("final count concurrentMap"+ConcurrentMapWithMap.concurrentMapWordCounts.get("work"));//多线程累加,每次都是40000 } }
阅读全文
0 0
- ConcurrentMap线程安全的正确用法
- JAVA线程安全之synchronized关键字的正确用法
- JAVA线程安全之synchronized关键字的正确用法
- JAVA线程安全之synchronized关键字的正确用法
- JAVA线程安全之synchronized关键字的正确用法
- Map 和ConcurrentMap 线程不安全和线程安全证明
- 使用正确的锁对象来保证线程安全
- java jdbc正确使用transaction 线程安全的TransactionManager
- java语言的线程安全volatile用法
- vector的详细用法---线程安全
- AtomicInteger类保证线程安全的用法
- ConcurrentMap的实现原理
- Qt线程与事件循环的正确用法
- concurrentMap
- concurrentMap
- concurrentMap
- ConcurrentMap
- python线程安全队列用法
- 公钥私钥
- python 迭代器
- 关于使用javapns时断线重连的解决方案
- Java进阶(十四)字符串的一系列knowledge
- CentOS 7 重置root密码的两种方法
- ConcurrentMap线程安全的正确用法
- (初识)世界开源框架之源Netty的世界
- #define宏中#的用法
- InternalResourceViewResolver
- JVM(三)HotSpot
- LightOJ
- py-faster-rcnn测试流程解读
- 四个福利性在线网站分享,每一个都让你欲罢不能……
- 怎样下载YouTube字幕文件