我已經在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