KKB:公平锁和非公平锁、多线程通信的问题

本文探讨了Java中显式锁(如ReentrantLock)默认的非公平性,并解释了如何通过设置公平锁来改变这一行为。此外,文章通过生产者消费者问题阐述了线程间的通信,指出简单的同步方法无法实现交替执行,而应利用wait和notifyAll方法配合标志变量来协调生产者和消费者的活动,以达到交替运行的效果。
摘要由CSDN通过智能技术生成

显式锁和隐式锁都是默认为非公平锁

 

意思就是锁,当有多个线程在抢一把锁的时候,不是按照先来后到的规律,而是锁一旦打开,大家都去抢,抢到是谁的,就给谁,这就是非公平锁(世界本来就是不公平的,所以锁也是,默认就是不公平)

 

我们可以将 显式锁定义成公平锁,fair 默认是 false, true:公平锁

 

多线程通信的问题

wait    notifyAll

生产者 与 消费者问题

我们想实现这么一个工作的流程,就是当生产者生产的时候,消费者是处于休眠状态,消费者不在运行。当消费者运行的时候,生产者就处于休眠不进行生产。

这样我们就达到一种交替运行的状态

 

问题的产生与解决过程:

这里我们可以创建两个类,都是线程,一个是生产的线程,另外一个是消费的线程,生产者只生产苹果,消费者也只消费苹果,所以还需要创建一个苹果的类,里面包括苹果的生产和消费的两个方法

我们在主方法里 就可以创建两个线程,一个生产苹果的线程,另外一个消耗苹果的线程

当我们直接运行程序的时候,肯定会出现异常的情况,比如说生产苹果的过程需要打标签包装,可能没来得及包装(苹果就没产生)就可能被消费者拿去吃了(吃了的苹果是上次生产的),等等情况

根据我们之前学的同步方法:使用同步代码块,使用同步方法运行

刚开始学的时候是这么想的,不就是在我们生产的过程另外一个线程调用了消费线程吗?那我给生产和消费方法都加一个同步就行了呀

实际上:

注意这时,我们在苹果类中的生产和消费方法都加入同步,由于两个方法都是苹果的类的方法,两个方法使用的是同一个锁,此时A方法释放了锁,不是说B就一定能得到锁,B方法 和A方法是会同时去竞争锁,不是A释放锁之后,A就不去抢锁了

所以 加同步方法达不到我们想要的交替执行的效果。我们就该使用线程之间的通信方法

等A执行完方法后,唤醒所有的线程notifyAll,然后A自己休眠wait。此时B方法拿到锁 进行操作之后,唤醒所有的线程,然后B自己休眠

我们还应该给生产设置一个flag,只有当flag为true的时候才生产,生产结束之后flag置为false。这样可以防止生产多个苹果,因为这里我们想要的效果是生产一个消费一个

这样就可以达到任务交替执行的效果

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你在狗叫什么、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值