线程中资源共享
//偶数生成器
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 由外部注入,如果注入时用的是同个对象,那就是同个对象。