考虑到单一责任原则适用于这些成员变量,为什么尝试使用其中的任何服务于两个目的:既来存储数据,并锁定?我想创建一个单独的成员变量只是锁:
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