多线程争用同一资源时的争用问题

我们举个例子来说明当同一个进程中的两个线程访问数据出现的问题。

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个包子,这就是他们征用同一资源的问题。

我们将在下一个博客进行解决资源征用问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值