java - 在 HashMap 上应用锁

标签 java multithreading hashmap synchronization locking

我有一个静态的 HashMap 和三个尝试从相应的类同时访问 HashMap 的线程。

每个线程的任务都是获取指定键的列表值,对列表进行一些操作(修改列表)。并将处理后的列表放入HashMap中。

我想让其他尝试访问HashMap的线程等待,直到当前线程完成处理并修改HashMap。

在某些情况下,流程是这样的,

线程A检索HashMap,当线程A正在对HashMap的列表进行处理时,其他线程B检索HashMap并开始处理。

实际行为必须是这样的: 线程A -> 检索HashMap -> 处理 -> 将值放入HashMap。 线程B -> 检索HashMap -> 处理 -> 将值放入HashMap。 线程 C -> 检索 HashMap -> 处理 -> 将值放入 HashMap。

逻辑:

  1. 对 HashMap 应用锁定
  2. 检索。
  3. 进程。
  4. 放入HashMap中。
  5. 释放锁定。

帮助我将逻辑转换为代码,或者任何建议都微笑接受。

最佳答案

你确实可以使用ReentrantReadWriteLock。这是该链接。

Javadoc for ReadWriteReentrant lock

我会像这样实现该功能............

public class Test {

        private Map<Object, Object> map = new HashMap<>();
        private ReentrantReadWriteLock reentrantReadWriteLock = new ReentrantReadWriteLock();

        public void process() {
            methodThatModifiesMap();
            methodThatJustReadsmap();
        }

        private void methodThatModifiesMap() {
            //if the code involves modifying the structure of the map like 'put(), remove()' i will acquire the write reentrantReadWriteLock
            reentrantReadWriteLock.writeLock().lock();
            try {
                //DO your thing and put() or remove from map
            }
            finally {
                //Dont forget to unlock
                reentrantReadWriteLock.writeLock().unlock();
            }
        }

        private void methodThatJustReadsmap() {
            // if all you are doing is reading ie 'get()'
            reentrantReadWriteLock.readLock().lock(); // this does not block other reads from other threads as long as there is no writes during this thread's read
            try {

            } finally {
                reentrantReadWriteLock.readLock().unlock();
            }
        }

    }

您的 map 不仅是线程安全的,而且吞吐量也更好。

关于java - 在 HashMap 上应用锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43120084/

相关文章:

python - 加入 Python 中的多个线程之一

javascript - 将对象转换为对象字典

java - 使用接口(interface) Class<T> 作为键来获取具体的实例值?

java - Java监视器和线程并发

multithreading - C++ fork/std::thread 和 boost::timed_join

java - Eclipse Mars 与 Maven 和 SVN 有冲突吗?

Java 在 MainThread.join() 时更新 GUI?

java - 多线程服务器客户端应用程序多次发送响应

Java - 如何将整数对象值存储到整数数组中?

java - 如何处理服务器和客户端中不同的数据包?