Java 并发专题 :闭锁 CountDownLatch 之一家人一起吃个饭

togetherToEat();

}

}

输出结果:

爸爸步行去饭店需要3小时。

妈妈挤公交去饭店需要2小时。

我乘地铁去饭店需要1小时。

一家人到齐了,开始吃饭

看似实现了,但是吃个饭,光汇合花了6个小时,第一个到的等了3个小时;话说回来,大家下班同时往饭店聚集,怎么也是个并行的过程,于是不用我说,大家肯定都行想到使用多线程,于是作为一名资深屌丝程序猿,开始改造我们的代码:

public static void main(String[] args)

{

new Thread()

{

public void run()

{

fatherToRes();

};

}.start();

new Thread()

{

public void run()

{

motherToRes();

};

}.start();

new Thread()

{

public void run()

{

meToRes();

};

}.start();

togetherToEat();

}

直接启动了3个线程,但是运行结果貌似也不对:

一家人到齐了,开始吃饭

我乘地铁去饭店需要1小时。

妈妈挤公交去饭店需要2小时。

爸爸步行去饭店需要3小时。

一个都没到,就开始吃饭了,,,(为了更好的显示,我在每个方法中休息了一段时间,模拟到达饭店的过程)。还是不行,那就继续完善:

private static volatile int i = 3;

public static void main(String[] args)

{

new Thread()

{

public void run()

{

fatherToRes();

i–;

};

}.start();

new Thread()

{

public void run()

{

motherToRes();

i–;

};

}.start();

new Thread()

{

public void run()

{

meToRes();

i–;

};

}.start();

while (i != 0);

togetherToEat();

}

我们定义了一个volatile修饰的int类型变量,初始值为3,当为0时代表一家人齐了,于是我们在主线程使用了一个忙等,一直等待所有人到达,这次效果看起来不错哦:

我乘地铁去饭店需要1小时。

妈妈挤公交去饭店需要2小时。

爸爸步行去饭店需要3小时。

一家人到齐了,开始吃饭

但是,忙等这样的代码对于CPU的消耗太巨大了,我们需要更好的实现方式。顺便说一下volatile,为什么我们用volatile修饰 i 呢, 因为当多个线程操作同一个变量时,为了保证变量修改对于其他线程的可见性,必须使用同步,volatile对于可见性的实现是个不错的选择,但是我们代码中的 i – 也有可能因为并发造成一定的问题,毕竟i–不是原子操作,正常最好使用同步块或者AtomicLong.decrementAndGet()实现–。

说了这么多,标题上的CountLatchDown竟然没出现,所以最终版,必须让这哥们出来亮相了:

private static CountDownLatch latch = new CountDownLatch(3);

public static void main(String[] args) throws InterruptedException

{

new Thread()

{

public void run()

{

fatherToRes();

latch.countDown();

};

}.start();

new Thread()

{

public void run()

{

motherToRes();

latch.countDown();

};

}.start();

new Thread()

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值