第四章 生产者消费者问题

该操作流程:

1、生产者负责信息内容的的生产;
2、每当生产者生产完一项完整的信息之后消费者要从这里面取走信息;
3、如果生产者没有生产玩则消费者要等待它生产完,如果消费者还没有对信息消费,则生产者应该等待消费处理完后再继续生产。

程序的基本结构

既然生产者与消费者是两个独立的线程,那么这两个独立的线程之间就需要有一个数据保存的地方,定义一个Message类实现数据保存。
在这里插入图片描述
在同步的时候肯定需要一个同步的处理对象,此时将同步操作交由message处理。但是同步不能解决重复操作问题。最好的解决方案使用等待唤醒机制。该机制主要依靠Object类中提供的方法处理的:
*等待机制:
——
*唤醒机制:
——
如果此时有若干个等待现成的话,那notify()表示的是唤醒第一个等待的,其他的线程继续等待。而notifyAll唤醒所有等待的线程,哪个线程的优先级高就有可能先执行。

守候线程

在多线程里可以定义守候线程,也就是说如果现在主线程的程序或其他线程还在执行的时候,那么守候线程将一直存在,并运行在后台。JVM中最大的守候线程是GC线程。

volatile关键字

在多线程定义中,volatile主要是在属性定义上使用的,表示此操作为直接数据操作,而不进行副本的拷贝处理。在这里插入图片描述
在正常进行变量处理的时候往往会经历如下步骤:
1、获取变量原有的数据内容副本;
2、利用副本为变量进行数学计算;
3、将计算后的变量保存到原始空间当中。
而如果一个属性上追加volatile关键字,表示的就是不使用副本,而是直接操作原始变量,相当于节约了:拷贝副本、重新保存的步骤。

volatile与synchronized的区别?
*volatile主要在属性上使用,而synchronized是在代码块与方法上使用的;
*volatile无法表述同步的处理,它只是一种直接内存的处理,避免了副本的操作,而synchronized是实现同步的。
两者没有本质的关联,但是volatile的使用不能离开synchronized。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值