在我设计的示例中,关于 teamMembers 列表对线程安全有什么影响?
我可以依靠run()
方法看到的列表状态保持一致吗?
假设
该
setATeamMembers
方法只被调用一次,在 spring 创建ATeamEpisode
bean时该
init
方法在 #1 之后由 spring (init-method) 调用ATeamMember
类是不可变的我需要申报
teamMembers
volatile
或类似吗?我忽略了这种方法还有其他可怕的问题吗?
如果这很明显,或者 rtfm 明显失败,请道歉
谢谢并恭祝安康
埃德
package aTeam;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class ATeamEpisode implements Runnable{
private List<ATeamMember> teamMembers;
/* DI by spring */
public void setATeamMembers(List<ATeamMember> teamMembers){
this.teamMembers = new ArrayList<ATeamMember>(teamMembers);
}
private Thread skirmishThread;
public synchronized void init(){
System.out.println("Starting skirmish");
destroy();
(skirmishThread = new Thread(this,"SkirmishThread")).start();
}
public synchronized void destroy(){
if (skirmishThread != null){
skirmishThread.interrupt();
skirmishThread=null;
}
}
private void firesWildlyIntoTheAir(ATeamMember teamMember){
System.out.println(teamMember.getName()+" sprays the sky..");
}
@Override
public void run() {
try {
Random rnd = new Random();
while(! Thread.interrupted()){
firesWildlyIntoTheAir(teamMembers.get(rnd.nextInt(teamMembers.size())));
Thread.sleep(1000 * rnd.nextInt(5));
}
} catch (InterruptedException e) {
System.out.println("End of skirmish");
/* edit as per Adam's suggestion */
// Thread.currentThread().interrupt();
}
}
}