线程之间的通信

本文深入解析线程通信的五种核心方法,包括park/unpark、volatile、synchronized结合wait/notify、CountDownLatch及Condition的awaitsignal。探讨单生产者单消费者到多生产者多消费者场景下的线程同步策略,避免死锁并确保高效的数据交换。

这次文章的编写:
掌握 线程通信的几种方式:
1.采用park/unpark的方式
2.采用volatile的方式进行线程之间的通信
3.采用可以利用synchronized结合wait notify实现
4.CountDownLatch 采用程序计数器来实现
5.Condition中的await signal 实现

park与unpark可以看做一个令牌,park就是等待令牌,unpark就是颁发一个令牌,另外需要注意的是park与unpark的调用次数不用一一对应,而且假如在同步代码块中调用park方法,线程会进入阻塞状态,但是不会释放已经占用的锁。容易造成死锁的发生,因为不会释放锁 假如 两个线程相互锁资源,导致线程死锁。

2.volatile表示的禁用CPU缓存,用volatile修饰的变量,会强制从主内存中读取变量的值。java内存模型中关于volatile也是有说明的,volatile只能保证可见性,但不能保证原子性。
可以在 需要通信的地方进行 等待的方式,来进行线程的通信,不需要采用锁的方式,便捷 而且更安全,
3.最原始的方式,采用锁的方式,
synchronized修饰同步代码块,而wait notify notify必须是在synchronized修饰代码块中使用,否则会抛出监视器异常。
使用方式 采用互斥锁,在 需要通信的时候,进行释放锁,唤醒 等待线程。这种方式 会在 第一个通知线程执行完毕之后才会执行下一个线程
4.使用Lock实现锁的机制,使用 await和 notity方法来实现线程之间的通信

以上的分析针对的是单生产者和单消费者的情况
当多生产者 多消费者的时候:
第一种的方式 就不适合了 很容易死锁,第二种 也可能 导致 多次消费和多次生产的情况

分析多生产者和多消费者的情况:

首先避免死锁的方式,不能出现 互相锁资源的情况。还要 避免 多次生产同一个和多次消费同一个
可以使用 notityAll 来实现 但是 需要叫醒 所有等待线程
推荐使用 :
Condition中的await signal 实现 可以传入对应的Condition 叫醒特定的 线程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值