7-X 丶东亭
关注数: 3 粉丝数: 23 发帖数: 352 关注贴吧数: 36
线程同步问题。。。 最近在think in java中看到这个程序 import java.util.Random; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class Horse implements Runnable { private static int counter = 0; private final int id = counter++; private int strides = 0; private CyclicBarrier barrier; private static Random rand = new Random(47); public synchronized int getStrides(){ return strides; } public Horse(CyclicBarrier barrier){ this.barrier = barrier; } @Override public void run() { // TODO Auto-generated method stu try { while(!Thread.interrupted()){ //synchronized(this){ strides+=rand.nextInt(3); //} barrier.await(); } } catch (InterruptedException e) { // TODO: handle exception } catch(BrokenBarrierException e2){ } } public String toString(){ return "Horse "+id; } public String stacks(){ StringBuilder s = new StringBuilder(); for(int i=0;i<getStrides();i++){ s.append("*"); } s.append(id); return s.toString(); } } import java.util.ArrayList; import java.util.List; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; public class HorseRace { static final int FINISH_LINE =75; private List<Horse> horses = new ArrayList<Horse>(); private ExecutorService exec = Executors.newCachedThreadPool(); private CyclicBarrier barrier; public HorseRace(int nHorses,final int pause){ barrier = new CyclicBarrier(nHorses,new Runnable(){ @Override public void run() { // TODO Auto-generated method stub StringBuilder s = new StringBuilder(); for(int i=0;i<FINISH_LINE;i++){ s.append("="); } System.out.println(s); for(Horse horse : horses){ System.out.println(horse.stacks()); } for(Horse horse : horses){ if(horse.getStrides() >= FINISH_LINE){ System.out.println(horse +" win!"); exec.shutdownNow(); return; } } try { TimeUnit.MILLISECONDS.sleep(pause); } catch (Exception e) { // TODO: handle exception System.out.println("barrier-action sleep interrupted !"); } } }); for(int i=0;i<nHorses;i++){ Horse horse = new Horse(barrier); horses.add(horse); exec.execute(horse); } } public static void main(String[] args) { int nHorses = 7; int pause =1000; new HorseRace(nHorses,pause); } } 不明白,为什么要对Horse中的本地变量 strides进行同步,哪位帮我解释下。。。。??
1 下一页