考慮到單一責任原則適用於這些成員變量,爲什麼嘗試使用其中的任何服務於兩個目的:既來存儲數據,並鎖定?我想創建一個單獨的成員變量只是鎖:
class Student {
private String name;
Student(String name) {
this.name = name;
}
String getName() {
return name;
}
}
private List<Student> students = new ArrayList<Student>();
private final Object lock = new Object();
...
public void updateList(){
Student newGuy = new Student("Joe");
synchronized (lock){
students.add(newGuy);
}
}
話雖如此,保羅對synchronized塊內沒有做IO好點。除了將IO移出同步塊外的鎖的另一種方法是使用Command模式與執行來自隊列的命令的單個線程的組合。一個命令可以將一個學生添加到列表中,隨後的命令可以將該列表寫入文件。您可以擁有儘可能多的線程,只要您將新命令投入到隊列中,就可以按照它們到達的順序執行。再次,在這裏應用SRP。每個命令只應做一件事。
編輯:
因此,儘管這比你想咬掉類可能更多,這種闡述了命令隊列的想法。
每一個命令是可運行的,你想要的run()方法做 - 增加了一個學生,寫入磁盤,等等。一旦啓動執行程序線程,它就會等待新的命令顯示在隊列中。如果沒有命令,則會阻塞,但其他線程可以繼續執行。如果有命令,它將與其他線程並行運行。
__你想什麼?爲什麼? –
這是一個標準的'ArrayList',還是一個['Collections.synchronizedList(ArrayList)'](http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html# synchronizedList(java.util.List))/ ['CopyOnWriteArrayList'](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CopyOnWriteArrayList.html)? – Powerlord
一個標準的ArrayList – WhatIf