gpt4 book ai didi

Java同步问题——多个聊天室应用程序聊天

转载 作者:行者123 更新时间:2023-12-01 17:35:09 25 4
gpt4 key购买 nike

我正在开发一个聊天应用程序。我有一个处理聊天消息的功能。每个聊天室都由唯一的短代码标识。现在我希望当处理一个短代码的消息时,相同短代码的另一条消息应该等待,而其他短代码的消息应该继续。

请考虑遵循代码和平,它有什么问题,因为相同短代码的消息正在并行处理。我只是猜不出问题所在

private HashMap<String, Object> locks = new HashMap<String, Object>();

public void handleShortCode(String shortcode,String message,String from)
{
Object lock = null;

lock = locks.get(shortcode);
if (lock == null)
{
locks.put(shortcode, lock = new Object());
}

synchronized (lock)
{
System.out.println("Handling shortcode:" + shortcode);
// processing
System.out.println("Successfully handled shortcode:" + shortcode + " ......");
}
}

最佳答案

我能看到的第一个原因就在这里

Object lock = null;

lock = locks.get(shortcode);
if (lock == null)
{
locks.put(shortcode, lock = new Object());
}

此代码块在任何互斥体之外执行,因此多个线程可以同时运行它,因此每个线程(具有相同的短代码)拥有自己的锁,彼此独立(并且它们中只有一个会存储在锁 hashmap 中——哪一个是问题所在,因为普通的 HashMap 不是为并发使用而设计的——你无法准确预测哪个“put”实际上会按哪个顺序生效,你甚至可以得到例如,如果当前的 put 导致调整大小,则此代码中出现异常或错误行为)。由于每个线程都获得自己的锁,因此它不会阻止它与其他线程并发地获取它,从而获得另一个锁。

最简单(但不是很有效)的修复方法:

private HashMap<String, Object> locks = new HashMap<String, Object>();
private final Object hashmapLock = new Object();
public void handleShortCode(String shortcode,String message,String from)
{
Object lock = null;
synchronized(hashmapLock){
lock = locks.get(shortcode);
if (lock == null)
{
locks.put(shortcode, lock = new Object());
}
}
synchronized (lock)
{
System.out.println("Handling shortcode:" + shortcode);
// processing
System.out.println("Successfully handled shortcode:" + shortcode + " ......");
}
}

这样,每个短代码就可以获得一个锁。更有效的方法是使用 Guava lib 中的 ComputableConcurrentHashMap 之类的东西。

关于Java同步问题——多个聊天室应用程序聊天,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7280878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com