在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
通常更容易和更安全,因为它内置了复杂的同步逻辑。