线程间通信机制,等待唤醒机制,生产者与消费者模型的案例

一,线程间通信介绍

概念:线程一旦开始运行,就会拥有自己独立的栈空间,那多个线程如何相互配合完成工作,这就涉及到了线程间的通信。

线程之间的通信:是使线程间能够互相发送信号,使线程能够等待其他线程的信号。比如线程 A 在执行到某个条件时,通知线程 B 再执行某个操作,我们希望多个线程协同工作来完成某个任务。

线程间通信的目的:通信的目的是为了更好的协作,线程无论是交替式执行,还是接力式执行,都需要进行通信告知。首先,要短信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析。

题目:有两个线程A、B,A线程向一个集合里面依次添加元素"abc"字符串,一共添加十次,当添加到第五次的时候,希望B线程能够收到A线程的通知,然后B线程执行相关的业务操作。

volatile关键字:基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想,大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式。

volatile有两大特性,一是可见性,二是有序性,禁止指令重排序,其中可见性就是可以让线程之间进行通信。

volatile语义保证线程可见性有两个原则保证

所有volatile修饰的变量一旦被某个线程更改,必须立即刷新到主内存.

所有volatile修饰的变量在使用之前必须重新读取主内存的值.

Object类的wait() 和 notify() 方法:众所周知,Object类提供了线程间通信的方法:wait()、notify()、notifyaAl(),它们是多线程通信的基础,而这种实现方式的思想自然是线程间通信。注意: wait和 notify、notifyaAl必须配合synchronized使用,wait方法释放锁,notify方法不释放锁

wait() 作用是使当前执行该代码的线程进入该对象锁的阻塞队列中进行等待(立即释放锁,进入等待锁的阻塞队列,下次被唤醒时,会接着往下执行),线程调用了对象锁的 wait 线程运行完毕以后,它会立即释放掉该对象锁。此时如果没有其他线程调用该对象锁的 notify 方法,则该调用过wait方法的线程由于没有得到该对象锁的通知,还会继续阻塞在 wait 状态,直到这个有线程调用此对象锁的 notify 或 notifyAll。

wait(lo

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值