java 生产者消费者_Java多线程操作系统(生产者、消费者问题)

进程同步是对多个相关进程在执行次序上进行协调,使并发执行的多个进程之间按照一定的规则共享系统资源。

1、生产者消费者问题:

生产者、消费者问题生产者生产产品放入缓冲区中,消费者从缓冲区中取出产品去消费。不允许消费者从空缓冲区中取产品,也不允许生产者向已经满了的缓冲区添加产品。

46f04b7b1dedf1ff639ca2cce9fb6648.png

2、过程描述:

生产者:

void producer(){    while(1)    {      while(counter==n);//缓冲池已满,不再执行后面的操作       buffer[in]=nextp;//将生产出来的产品放入缓冲池      in=(in+1)%n;//指针后移      counter++;        } } 

消费者:

void consumer(){    while(1)    {      while(counter==0);//缓冲池为空,不再执行后面的操作      nextc=buffer[out];//取出一件产品      out=(out+1)%n;//指针后移       counter--;     }} 

如果不对生产者和消费者进程加以控制会出现不同的结果 (有正确的有错误的),即进程的不可再现性,这是由于进程失去了封闭性引起的。

3、进程同步(信号量机制):

(1)使用wati()和signal()操作来实现对临界资源的访问。

semaphone mutex=1;Pa(){    while(1){        wait(mutex);//进入区         临界区;//访问临界资源的代码         signal(mutex);//退出区         剩余区; //其他部分     }} 

(2)信号量机制解决进程同步问题:

生产者:

int n=0,out=0;item buffer[n];semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个void producer)(){    while(1){        wait(empty);//先对缓冲区执行p操作,如果empty执行之前为0,则阻塞,不必在执行后面的        wait(mutex);//减缓冲池        buffer[in]=nextp;//将生产出来的产品放入缓冲池        in=(in+1)%n;//指针后移        signal(mutex);//释放资源,v操作         signal(full);        }} 

消费者:

int n=0,out=0;item buffer[n];semaphore mutex=1,empty=n,full=0;//缓冲池一个,空缓冲区n个,满缓冲区0个void consumer(){    while(1){        wait(full);//先对缓冲区执行p操作,如果full执行之前为0,则阻塞,不必在执行后面的        wait(mutex);//减缓冲池        buffer[in]=nextp;//将消费的产品放入缓冲池        out=(out+1)%n;//指针后移        signal(mutex);//释放资源,v操作         signal(full);                }}  

其中,mutex信号量保证了消费者和生产者对缓冲池的互斥访问,即在消费者(或生产者)释放资源之前, 消费者(或者生产者)不能再利用缓冲池。

(3)信号量值的意义:

例如:设某一个信号量的初始值为1,进行一次p操作后变为0,此时,已经没有资源了,但是没有进程处于阻塞;

进行第二次操作后,变为-1,表示已经没有资源了,并且另外一个进程处于阻塞状态;

初始值1表示可用资源数量。

今天的分享就到这了,我这里准备了一套java进阶方法笔记,学习资料面试题,电子书等免费笔记供大家学习.需要的小伙伴私信我回复"Java"即可领取免费资料.

882cb0a3c770dcf17b42acb0051081b1.png
99f3a4cbc431d7d85aa99a96f1bc9efb.png
b51f3192371ce34e9256a890ba113812.png

java核心知识点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值