日期:2014-05-20  浏览次数:20595 次

线程中资源共享
//偶数生成器
public abstract class IntGenerator {
private volatile boolean canceled =false;
public abstract int next();
public void cancel(){  canceled=true;}
public boolean isCanceled(){return canceled;} 
 
}
/**
 * 同步规则: 如果你正在写一个变量,它可能接下来被另个线程读取,
 * 或者正在读取一个上一次已经被另一个线程写过的变量,
 * 那么你必须使用同步,并且,读写线程都必须用相同的监视器锁同步
 * @author Administrator
 *
 */
public class EvenGenerator extends IntGenerator {
private int currentEventValue=0;
 
@Override
public   int next() { 
 
++currentEventValue;
 Thread.yield();
++currentEventValue;
 
return currentEventValue;
}
public static void main(String[] args) {
EvenChecker.test(new EvenGenerator(),10);
}

}


public class EvenChecker implements Runnable{
private IntGenerator generator;  
private final int id;
public EvenChecker(IntGenerator g,int ident){

generator=g;
id=ident;
System.out.println(generator);
}
@Override
public void run() {
while(!generator.isCanceled()){
//this 属于不同对象,为什么generator 属于同一对象。
int val=this.generator.next();  //属于同一对象 , 会造成资源的共享
System.out.println(val + " ****"+id+" =="+this +"**********"+this.generator);

//System.out.println(val + " not even----------"+id+" =="+this); 
if(val%2!=0){
System.out.println(val + " not even******************************************************"+id+" =="+this);

// generator.cancel();
 
}

}
}
public static void test(IntGenerator gp,int count){
System.out.println("press control -c to exit");
ExecutorService exec=Executors.newCachedThreadPool();
for(int i=0;i<count;i++){
exec.execute(new EvenChecker(gp,i)); 
}
exec.shutdown();
}
public static void test(IntGenerator gp){
test(gp,10);
}

}

在测试中//this 属于不同对象,为什么generator 属于同一对象。
java?线程

------解决方案--------------------
this指的是对象本身,当然各个对象不同。
generator  由外部注入,如果注入时用的是同个对象,那就是同个对象。