gpt4 book ai didi

java - 如何同步两个方法

转载 作者:行者123 更新时间:2023-12-03 00:05:30 24 4
gpt4 key购买 nike

我有以下 Java 聊天服务器应用程序代码 -

public synchronized List<ChatMessage> getMessages(int messageNumber) {
return messages.subList(messageNumber + 1, messages.size());
}

public synchronized int addMessage(ChatMessage c) {
messages.add(c);
return messages.size()-1;
}

我有以下测试代码 -

public static void main(String[] args) {
final ChatRoom c = new ChatRoom();
Thread user1 = new Thread(new Runnable() {
public void run() {
for(int i=0;i<1000;i++) {
c.addMessage(new ChatMessage());
c.getMessages(0);
}
}
});
Thread user2 = new Thread(new Runnable() {
public void run() {
for(int i=0;i<1000;i++) {
c.addMessage(new ChatMessage());
c.getMessages(0).size();
}
}
});
user1.start();
user2.start();
}

我收到 ConcurrentModificationException。

这怎么可能?

最佳答案

How is this possible?

您的 getMessages 方法仅返回原始列表上的 View 。它不会创建列表的副本。因此,一个线程正在使用列表上的 View ,而另一个线程则修改列表 - 此时,您会遇到异常。

来自 List.subList 的文档:

The semantics of the list returned by this method become undefined if the backing list (i.e., this list) is structurally modified in any way other than via the returned list. (Structural modifications are those that change the size of this list, or otherwise perturb it in such a fashion that iterations in progress may yield incorrect results.)

目前尚不清楚您真正想要实现的目标是什么,但从根本上讲,您不能使用 subList 神奇地创建线程安全列表:)

关于java - 如何同步两个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10086527/

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