我们举个例子来说明当同一个进程中的两个线程访问数据出现的问题。
public class 包子笼 {
public int pack=100;
}
public class 吃包子的 extends Thread{
private 包子笼 p=null;
private String name=null;
public 吃包子的(包子笼 p,String name){
this.p=p;
this.name=name;
}
public void run(){
while (true){
if (this.p.pack<=0)break;
System.out.println(this.name+"吃第"+this.p.pack+"个包子");
this.p.pack--;
}
}
}
public class 测试吃包子的 {
public static void main(String[] args) {
包子笼 p=new 包子笼();
吃包子的 c1=new 吃包子的(p,"张三");
吃包子的 c2=new 吃包子的(p,"李四");
c1.start();
c2.start();
System.out.println();
}
}
我们运行以上代码,运行出来,发现张三和李四吃的包子的顺序重合了,这是问什么呢?
因为我们在执行线程的时候并不是真正的"同时进行",而是分时段进行的,当张三在吃第100个包子的时候,还没进行输出,包子的个数还没减少,这时张三所能使用的时间完了,该李四进行程序了,但是,包子的数量还没有减少,运行时李四还吃的时第100个包子,当继续轮到张三的时候,它继续输出张三吃第100个包子,这就是他们征用同一资源的问题。
我们将在下一个博客进行解决资源征用问题。