版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43874301/article/details/102459667
高并发编程系列(三)
High concurrency programming series
notify之后,t1必须释放锁,t2退出后,也必须notify,通知t1继续执行.
整个通信比较繁琐
使用latch(门闩)代替wait notify来进行通知
好处是处理通信方式简单,同时也可以指定等待时间
使用await 和countdown 方法代替wait 和notify
CountDownLatch不涉及锁定,当count的值为零时前线程继续运行.
当不涉及同步,只是涉及线程通信的时候,用synchronized + wait/notify 就显得太重要了.
这是应该考虑countDownlatch/cyclibarrier/semaphore.
public class Tu {
volatile List lists = new ArrayList();
public void add(Object o) {
lists.add(o);
}
public int size() {
return lists.size();
}
public static void main(String[] args) {
Ts t = new Ts();
//一个门闩 为零时门就开了
CountDownLatch latch = new CountDownLatch(1);
new Thread(() -> {
System.out.println("t2启动");
if (t.size() != 5) {
try {
latch.await();
//也可以指定时间
//latch.await(5000,TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("t2结束");
},"t2").start();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(() -> {
System.out.println("t1启动");
for (int i=0; i<10; i++) {
t.add(new Object());
System.out.println("欢迎关注掌上编程公众号" + i);
if (t.size() == 5) {
//打开门闩 让t2得以进行
latch.countDown();
}
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
},"t1").start();
}
}