在 java 中同步从两个线程对 HashMap 的访问



我有两个线程正在运行(一个是主线程(比如说Thread1),另一个是后台线程(比如Thread2))。我可以从Thread1Thread2访问HashMap变量hashMapThread1修改hashMap,Thread2读取HashMap。

Thread1代码将是:

synchronized(hashMap){
   //updating hashMap 
}

在 Thread2 中,代码将是:

synchronized(hashMap){
     //reading hashMap
}

是否可以以这种方式使用 synchronized block 同步对hashMap的访问?

是的。但您也可以使用 Collections.syncdMap 实用程序方法来使哈希映射线程安全:

Map yourMap = new HashMap();
Map synchronizedMap = java.util.Collections.synchronizedMap(yourMap);

或者你可以使用ConcurrentHashMapHashtable,它们在默认情况下是线程安全的。

您应该尝试使用 HashTableConcurrentHashMap 。这两个类都是同步的,因此您不必自己处理它。

此外,请考虑使用 Lock .

请看:

1. Java 同步块。

2. 内在锁和同步。

3. Java 和 Kotlin 中的同步、线程安全和锁定技术。

4.关于正确使用易失性和同步性。

我会使用ReadWriteLock

ReadWriteLock rwl = new ReentrantReadWriteLock();
void read() {
    rwl.readLock().lock();
    try {
        ... read
    } finally {
        rwl.readLock().unlock();
    }
}
void write() {
    rwl.writeLock().lock();
    try {
        ... write
    } finally {
        rwl.writeLock().unlock();
    }
}

最新更新