java并发初探ConcurrentSkipListMap

ConcurrentSkipListMap以调表这种数据结构以空间换时间获得效率,通过volatile和CAS操作保证线程安全,而且它保证了有序性,比TreeMap比线程安全。

跳表结构

通过level down right可以更快插入和查找元素

     ** Head nodes          Index nodes* +-+    right        +-+                      +-+* |2|---------------->| |--------------------->| |->null* +-+                 +-+                      +-+*  | down              |                        |*  v                   v                        v* +-+            +-+  +-+       +-+            +-+       +-+* |1|----------->| |->| |------>| |----------->| |------>| |->null* +-+            +-+  +-+       +-+            +-+       +-+*  v              |    |         |              |         |* Nodes  next     v    v         v              v         v* +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+* | |->|A|->|B|->|C|->|D|->|E|->|F|->|G|->|H|->|I|->|J|->|K|->null* +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+  +-+

例子


package com.java.javabase.thread.collection;import lombok.extern.slf4j.Slf4j;import java.security.SecureRandom;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentSkipListMap;/*** @author*/
@Slf4j
public class ConcurrentSkipMapTest {//public static TreeMap<String, Integer> map = new TreeMap();public static ConcurrentSkipListMap<String, Integer> map = new ConcurrentSkipListMap<>();public static int size = 10;public static void main(String[] args) {InnerThread t1 =new InnerThread("t1");InnerThread t2 =new InnerThread("t2");t1.start();t2.start();try {Thread.sleep(1000);printMap(map);} catch (InterruptedException e) {e.printStackTrace();}}static class InnerThread extends Thread {String name;public InnerThread(String name) {super(name);this.name=name;}@Overridepublic void run() {Random random = new Random(System.currentTimeMillis());for (int i = 0; i < size; i++) {String key =String.valueOf(random.nextInt(1000))+name;//Wlog.info(key);map.put(key, Integer.valueOf(i));printMapNone(map);}}}public static void printMap(Map<String, Integer> map) {//Iterator<Map.Entry<K,V>> i = entrySet().iterator();Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry<String, Integer> entry = it.next();String key = entry.getKey();Integer value = entry.getValue();log.info("key {} value {}", key, value);}}public static void printMapNone(Map<String, Integer> map) {//Iterator<Map.Entry<K,V>> i = entrySet().iterator();Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();while (it.hasNext()) {Map.Entry<String, Integer> entry = it.next();String key = entry.getKey();Integer value = entry.getValue();}}
}

run result

019-08-28 19:34:31,919   [main] INFO  ConcurrentSkipMapTest  - key 101t1 value 5
2019-08-28 19:34:31,921   [main] INFO  ConcurrentSkipMapTest  - key 101t2 value 5
2019-08-28 19:34:31,921   [main] INFO  ConcurrentSkipMapTest  - key 131t1 value 7
2019-08-28 19:34:31,921   [main] INFO  ConcurrentSkipMapTest  - key 131t2 value 7
2019-08-28 19:34:31,922   [main] INFO  ConcurrentSkipMapTest  - key 180t1 value 3
2019-08-28 19:34:31,922   [main] INFO  ConcurrentSkipMapTest  - key 180t2 value 3
2019-08-28 19:34:31,922   [main] INFO  ConcurrentSkipMapTest  - key 209t1 value 9
2019-08-28 19:34:31,922   [main] INFO  ConcurrentSkipMapTest  - key 209t2 value 9
2019-08-28 19:34:31,922   [main] INFO  ConcurrentSkipMapTest  - key 349t1 value 6
2019-08-28 19:34:31,922   [main] INFO  ConcurrentSkipMapTest  - key 349t2 value 6
2019-08-28 19:34:31,923   [main] INFO  ConcurrentSkipMapTest  - key 527t1 value 4
2019-08-28 19:34:31,923   [main] INFO  ConcurrentSkipMapTest  - key 527t2 value 4
2019-08-28 19:34:31,923   [main] INFO  ConcurrentSkipMapTest  - key 655t1 value 1
2019-08-28 19:34:31,923   [main] INFO  ConcurrentSkipMapTest  - key 655t2 value 1
2019-08-28 19:34:31,923   [main] INFO  ConcurrentSkipMapTest  - key 714t1 value 8
2019-08-28 19:34:31,923   [main] INFO  ConcurrentSkipMapTest  - key 714t2 value 8
2019-08-28 19:34:31,923   [main] INFO  ConcurrentSkipMapTest  - key 781t1 value 2
2019-08-28 19:34:31,924   [main] INFO  ConcurrentSkipMapTest  - key 781t2 value 2
2019-08-28 19:34:31,924   [main] INFO  ConcurrentSkipMapTest  - key 797t1 value 0
2019-08-28 19:34:31,924   [main] INFO  ConcurrentSkipMapTest  - key 797t2 value 0

转载于:https://www.cnblogs.com/JuncaiF/p/11426101.html

java并发初探ConcurrentSkipListMap相关推荐

  1. java并发初探ConcurrentHashMap

    java并发初探ConcurrentHashMap Doug Lea在java并发上创造了不可磨灭的功劳,ConcurrentHashMap体现这位大师的非凡能力. 1.8中ConcurrentHas ...

  2. java并发初探ThreadPoolExecutor拒绝策略

    java并发初探ThreadPoolExecutor拒绝策略 ThreadPoolExecuter构造器 corePoolSize是核心线程池,就是常驻线程池数量: maximumPoolSize是最 ...

  3. java并发初探CyclicBarrier

    java并发初探CyclicBarrier CyclicBarrier的作用 CyclicBarrier,"循环屏障"的作用就是一系列的线程等待直至达到屏障的"瓶颈点&q ...

  4. java并发初探CountDownLatch

    java并发初探CountDownLatch CountDownLatch是同步工具类能够允许一个或者多个线程等待直到其他线程完成操作. 当前前程A调用CountDownLatch的await方法进入 ...

  5. java并发初探ReentrantWriteReadLock

    java并发初探ReentrantWriteReadLock ReenWriteReadLock类的优秀博客 ReentrantReadWriteLock读写锁详解 Java多线程系列--" ...

  6. Java并发指南14:Java并发容器ConcurrentSkipListMap与CopyOnWriteArrayList

    原文出处http://cmsblogs.com/ 『chenssy』 到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash.TreeMap,这两种数据结构各自都有着优缺 ...

  7. java并发:初探sleep方法

    sleep与wait sleep是Thread方法,使得当前线程从运行态变为阻塞态.但它不会释放对象的锁. wait方法是Object方法,它的作用是使得当前拥有对象锁的线程从运行态变为阻塞态, 它会 ...

  8. Java 并发编程之 ConcurrentHashMap,ConcurrentSkipListMap

    Java并发容器Map类有两个,ConcurrentHashMap和ConcurrentSkipListMap,前者是无序的,后者有序. public class ConcurrentHashMapT ...

  9. Java并发基础框架AbstractQueuedSynchronizer初探(ReentrantLock的实现分析)

    AbstractQueuedSynchronizer是实现Java并发类库的一个基础框架,Java中的各种锁(RenentrantLock, ReentrantReadWriteLock)以及同步工具 ...

最新文章

  1. python预处理缺失值_[Scikit-Learn] - 数据预处理 - 缺失值(Missing Value)处理
  2. 180C. Letter
  3. 直接插入排序(C语言)实现
  4. (xy)+((x^y)1)求(245, 112)结果是多少
  5. 决策树系列(四)——C4.5
  6. c#.net全站防止SQL注入类的代码
  7. 黑马程序员_毕向东_Java基础视频教程第01天
  8. 2023年云南大学现代技术教育考研上岸前辈备考经验
  9. oracle脏读如何解决,关于脏读分析
  10. 【研究报告】从单目深度估计到单目三维场景重建-沈春华老师-VALSE Webinar 22-13(总第279期)
  11. 函数:判断一个整数是否既是5又是7的整倍数
  12. Linux的常用命令有哪些?
  13. 奥塔在线:VisualStudio中使用Git的详细配置说明
  14. [转]直播云平台架构如何构建? 附PPT
  15. 咚咚咚————【电路设计】关于赛车的应力采集设计原理
  16. 一键等比切割多块图片
  17. pixhawk:如何飞控出厂配置
  18. “胶原蛋白第一股”来了,巨子生物上市在即
  19. NOD32 杀毒软件
  20. 小工具:FlickrEdit和Picasa Webalbums Assistant,批量下载图片

热门文章

  1. 图像处理---《在图片上打印文字 FreeType库》
  2. 织梦dede:channelartlist调用排除指定typeid栏目
  3. va_start、va_end、va_arg 实现可变长参数
  4. Golang入门第一天-工具准备
  5. [刷题]算法竞赛入门经典(第2版) 6-7/UVa804 - Petri Net Simulation
  6. Windos环境用Nginx配置反向代理和负载均衡
  7. LintCode刷题笔记-- BackpackIII
  8. maven nexus myeclipse 学习
  9. matlab乘幂的指数是矩阵,信号与系统MATLAB基本语法.ppt
  10. python用matplotlib画球_python 如何用matplotlib画一个漂亮的圆-百度经验