【问题标题】:Synchronize access to HashMap from two threads in java从java中的两个线程同步访问HashMap
【发布时间】:2014-03-06 17:19:08
【问题描述】:

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

Thread1 中的代码将是:

synchronized(hashMap){
   //updating hashMap 
}

在 Thread2 中的代码将是:

synchronized(hashMap){
     //reading hashMap
}

这样可以使用synchronized block同步对hashMap的访问吗?

【问题讨论】:

    标签: java android multithreading collections synchronized


    【解决方案1】:

    是的。但是你也可以使用 Collections.synchronizedMap 实用方法来使 hashmap 线程安全:

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

    或者您可以使用默认线程安全的 ConcurrentHashMapHashtable

    【讨论】:

    • Collections.synchronizedMap 使方法调用原子化,当涉及到迭代和其他“多动作操作”时,它并没有使其完全线程安全,您仍然需要一个 synchronized 块,如documentation HashTable 完全一样。 ConcurrentHashMap 相当安全,但它不保证完全线程安全,具体取决于您的需要。您仍然可以以非原子方式对其进行修改。
    【解决方案2】:

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

    另外,考虑使用Lock

    请看:

    1. Java Synchronized Blocks.

    2. Intrinsic Locks and Synchronization.

    3Synchronization, Thread-Safety and Locking Techniques in Java and Kotlin.

    4. On properly using volatile and synchronized.

    【讨论】:

    • 我很困惑。 @Serdar 说可以做到,但你说的完全相反。你能正确指定哪个是正确的方式吗?
    【解决方案3】:

    我会使用 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();
        }
    }
    

    【讨论】:

    • 如果您有超过 1 个线程读取,则单独的读/写锁是有意义的,因为它们确实允许任意数量的读取线程,而没有线程正在写入。除非是这种情况,否则我不会使用它们:stackoverflow.com/questions/11638233/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    相关资源
    最近更新 更多