02 RedissonSpinLock

redisson 基于 org.redisson:redisson-spring-data-27:3.27.2 版本

java 中,操作 redis 一般都会选择 redisson 框架, 我们需要了解常用功能的实现原理, 这次来介绍 RedissonSpinLock

使用方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@Test
void testSpinLock() {
    RLock lock = redissonClient.getSpinLock("lock");
    try {
        lock.lock();
        ThreadUtil.sleep(30, TimeUnit.SECONDS);
        System.out.println("xxx");
    } finally {
        lock.unlock();
    }
}

lock

源码位置: org.redisson.RedissonSpinLock#lock

01 RedissonLock

redisson 基于 org.redisson:redisson-spring-data-27:3.27.2 版本

java 中,操作 redis 一般都会选择 redisson 框架, 我们需要了解常用功能的实现原理, 这次来介绍 RedissonLock

使用方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
@Test
void testDistributedLock() {
    RLock lock = redissonClient.getLock("lock");
    try {
        lock.lock();
        ThreadUtil.sleep(30, TimeUnit.SECONDS);
        System.out.println("xxx");
    } finally {
        lock.unlock();
    }
}

上面是最常见分布式锁使用示例, redisson 的锁分为好几种,我们先以 RedissonLock 来说明。

05 TreeMap

jdk 基于 8 版本

在平时的开发中,我们很少会用到 TreeMap, 但是还是需要了解源码TreeMap 基于红黑树来实现按照 key 排序,关于这个算法,这里不做解释。

使用方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class TreeMapTest {

    @Test
    void test() {
        Map<String, String> map = new TreeMap<>();
        map.put("1", "a");
        map.put("2", "b");
        assertThat(map.remove("1")).isEqualTo("a");
        assertThat(map.put("2", "c")).isEqualTo("b");
        assertThat(map.get("2")).isEqualTo("c");
    }
}

因为是 Map 接口的实现类 ,所以使用方式是差不多的。只不过在遍历过程中,是按照 key 值排序的。

04 LinkedHashMap

jdk 基于 8 版本

在平时的开发中,我们会经常用到 LinkedHashMap, 非常有必要了解源码
LinkedHashMap 基于 HashMap 来实现, 内部借助双向链表来维持访问顺序,可以用来实现 LRU 算法。

使用方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class LinkedHashMapTest {

    @Test
    void test() {
        Map<String, String> map = new LinkedHashMap<>();
        map.put("1", "a");
        map.put("2", "b");
        assertThat(map.remove("1")).isEqualTo("a");
        assertThat(map.put("2", "c")).isEqualTo("b");
        assertThat(map.get("2")).isEqualTo("c");
    }
}

对于使用方式来说,LinkedHashMapHashMap 是一样的,只不过 LinkedHashMap遍历过程中是有序的, 实现原理是在添加元素时,需要把元素移动到双向链表的尾部,然后遍历时直接取双向链表

03 HashMap

jdk 基于 8 版本

在平时的开发中,我们会经常用到 HashMap, 非常有必要了解源码
HashMap 基于拉链法红黑树来实现,关于这两个算法,这里不做解释。

使用方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class HashMapTest {

    @Test
    void test() {
        Map<String, String> map = new HashMap<>();
        map.put("1", "a");
        map.put("2", "b");
        assertThat(map.remove("1")).isEqualTo("a");
        assertThat(map.put("2", "c")).isEqualTo("b");
        assertThat(map.get("2")).isEqualTo("c");
    }
}

put

源码位置: java.util.HashMap#put

时间轮和线程池实现任务执行器

java 的线程池可以充当一个任务执行器的,但是有时候不符合我们的要求,所以需要自定义开发。
满足1:可以根据任务数量来动态调整核心线程数最大线程数
满足2:支持重复执行的任务。