我有两个线程正在运行(一个是主线程(比如说Thread1
),另一个是后台线程(比如Thread2
))。我可以从Thread1
和Thread2
访问HashMap
变量hashMap
。 Thread1
修改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);
或者你可以使用ConcurrentHashMap或Hashtable,它们在默认情况下是线程安全的。
您应该尝试使用 HashTable
或 ConcurrentHashMap
。这两个类都是同步的,因此您不必自己处理它。
此外,请考虑使用 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();
}
}