在HashMap上应用锁定

时间:2017-03-30 13:58:44

标签: java multithreading hashmap synchronization locking

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

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

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

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

线程A被检索到HashMap,而线程A正在处理HashMap列表,其他线程B检索HashMap并开始处理。

实际行为必须如下: Thread A -> retrieves HashMap -> process -> put value in HashMap. Thread B -> retrieves HashMap -> process -> put value in HashMap. Thread C -> retrieves HashMap -> process -> put value in HashMap.

逻辑:

  1. 对HashMap应用锁定
  2. 检索。
  3. 过程。
  4. 放入HashMap。
  5. 释放锁定。
  6. 帮助我将逻辑转换为代码,或者微笑接受任何建议。

3 个答案:

答案 0 :(得分:1)

您可以使用 ConcurrentHashMap 代替HashMap。 ConcurrentHashMap提供了更好的性能,并减少了在其他线程访问时锁定整个HashMap的开销。 您也可以在此页面上找到更多详细信息 - http://crunchify.com/hashmap-vs-concurrenthashmap-vs-synchronizedmap-how-a-hashmap-can-be-synchronized-in-java/

答案 1 :(得分:0)

你可以按照上面的建议使用ConcurrentHashMap,也可以使用类级别锁。我的意思是在静态方法上使用synchronized关键字.eg

public class SynchronizedExample extends Thread {
    static HashMap map = new HashMap();
    public synchronized static void execute() {
        //Modify and read HashMap
    }

    public void run() {
            execute();
    }
}

另外正如其他人所提到的,如果使用同步方法会导致性能瓶颈,这取决于你所做的原子功能。 您还可以检查类级别锁定与对象级别锁定(虽然它几乎相同,但请检查它。)

答案 2 :(得分:0)

你真的可以使用ReentrantReadWriteLock。这是链接。

Javadoc for ReadWriteReentrant lock

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

session_start();
$_SESSION["uname"] = $_POST["username"];

不仅您的地图是线程安全的,吞吐量也更好。