我已经在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的。
这怎么可能?
乔恩斯波特回答了我的问题! :-O问题本身就解决了。 :-) – 2012-04-10 09:59:17
但是我的困惑是一个线程如何迭代视图,即当另一个线程修改它时调用getMessages(),因为getMessages()和addMessage()都是同步的。为什么同步不会在方法级别发生? – 2012-04-10 10:02:01
@MonikaMichael:你正在同步的* result *上调用'size()' - 这就是问题所在。您在一个线程中创建子列表,释放锁,另一个线程获取锁,在底层列表上调用add()方法(使视图无效),然后在第一个线程中调用size()。 – 2012-04-10 10:05:55