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;
} @Override
public 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

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并发容器——ConcurrentSkipListMap和ConcurrentHashMap

    一:ConcurrentSkipListMap TreeMap使用红黑树按照key的顺序(自然顺序.自定义顺序)来使得键值对有序存储,但是只能在单线程下安全使用:多线程下想要使键值对按照key的顺序来 ...

  8. java并发:初探sleep方法

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

  9. java并发队列

    阻塞队列 常见的阻塞队列有ArrayBlockingQueue,LinkedBlockingDeque,LinkedBlockingQueue,这些队列有界且可以阻塞线程 ArrayBlockingQ ...

随机推荐

  1. maven设置指定jdk版本

    今天心血来潮准备折腾一下jeecg,去下载了一个maven版本的项目,既然下载了maven版的,当然就要配置好maven环境了. 因为之前简单学习过maven,当时使用的版本是3.3.9的,但是今天在 ...

  2. Springmvc-crud-07(springmvc标签错误)

    错误:springmvc标签错误 原因:1.在springmvc中的form标签中没有绑定modelAttribute属性 2.必须要获取到参数(可以创建map对象,进行存储参数,再用modelAtt ...

  3. 史上最全CentOS6离线安装部署Cloudera Manager5.9.3

    史上最全CentOS6离线安装部署Cloudera Manager5.9.3

  4. pandas库笔记

    本笔记为自学笔记 1.pandas.DataFrame() 一种保存矩阵的数据格式 grades_df = pd.DataFrame( data={'exam1': [43, 81, 78, 75, ...

  5. 洛谷P1734 最大约数和(01背包)

    题目描述 选取和不超过S的若干个不同的正整数,使得所有数的约数(不含它本身)之和最大. 输入格式 输入一个正整数S. 输出格式 输出最大的约数之和. 输入输出样例 输入 #1 11 输出 #1 9 说 ...

  6. AliWareMQ

    mq配置文件(Spring) 主要是顺序消息的配置,以及多实例的配置(需要在控制台配置p/c) <?xml version="1.0" encoding="UTF- ...

  7. dp(武功秘籍)

    众所周知,太吾绘卷是非常爱(niu)你(bi)的国产武侠游戏,里面有一个继承系统,当你死后可以在你的子孙中挑选一个继承人,用他的人物继续进行游戏.当你挑选继承人的时候一定会挑选能力最强,天赋最高的那一 ...

  8. java 限制每隔15分钟才允许执行一次程序

    由于公司订餐平台,有个用户催单业务,每当用户点击催单按钮时,商家就会收到消息提示,如果用户频繁的发起催单请求,这样商家就会不停的收到消息提醒,所以想限制用户至少每隔15分钟才可以催单一次 我采取了以下 ...

  9. nginx+keepalived实现主从高可用

    设备: 主:192.168.200.122 从:192.168.200.124 安装:两台都分别安装nginx以及keepalived 两台机步骤一致一主一从 安装nginx的依赖包 [root@lo ...

  10. P1428

    AC: #include <stdio.h> #define rep(i, a, b) for(int i = a; i <= b; i++) #define min(a, b) ( ...