WinddSnow

自行强化HashMap,使得线程安全

字数统计: 373阅读时长: 1 min
2023/10/13

在Java中,不使用ConcurrentHashMap的前提下,通过自行加强HashMap,使得HashMap线程安全,一般思路都是加锁,可以是普通的lock锁,也可以是其他锁,具体操作如下:

使用HashMap和显示的同步机制,如ReentrantLock来保证多线程安全访问。下面是一个简单的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.locks.ReentrantLock;

public class CustomThreadSafeHashMap<K, V> {
private final Map<K, V> map = new HashMap<>();
private final ReentrantLock lock = new ReentrantLock();

public void put(K key, V value) {
lock.lock(); // 获取锁
try {
map.put(key, value);
} finally {
lock.unlock(); // 释放锁
}
}

public V get(K key) {
lock.lock(); // 获取锁
try {
return map.get(key);
} finally {
lock.unlock(); // 释放锁
}
}

public boolean containsKey(K key) {
lock.lock(); // 获取锁
try {
return map.containsKey(key);
} finally {
lock.unlock(); // 释放锁
}
}

public void remove(K key) {
lock.lock(); // 获取锁
try {
map.remove(key);
} finally {
lock.unlock(); // 释放锁
}
}

// 其他操作方法可以类似实现

public int size() {
lock.lock(); // 获取锁
try {
return map.size();
} finally {
lock.unlock(); // 释放锁
}
}
}

上述代码创建了一个自定义的线程安全HashMap类 CustomThreadSafeHashMap,其中使用ReentrantLock来保护对底层HashMap的访问。每个公共方法在执行前都会获取锁,并在执行结束后释放锁,以确保多线程安全。

请注意,生产开发请使用ConcurrentHashMap通常更容易和更安全,因为它内置了复杂的同步逻辑。

CATALOG