关于synchronized

关于synchronized

老师 为什么这个地方用到了synchronized还是会出现问题呢。之前的银行案例没有用到wait()只要用synchronized就行了呀!

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好,1. synchronized只是保证同一时刻只有一个线程可以执行某个方法。无法保证线程的执行顺序。

2. 在Bank案例中的存取款中加入循环(创建多个线程),也会出现与生产、消费案例相同的问题。如下图所示:只是原本的线程较少,产生的随机性不明显。

http://img1.sycdn.imooc.com//climg/5f081e5c0988cddc03910515.jpg

http://img1.sycdn.imooc.com//climg/5f081eb2090a13b405340308.jpg

http://img1.sycdn.imooc.com//climg/5f081ea409decfc606180342.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 枢九 提问者 #1
    谢谢老师 老师真好
    2020-07-10 16:00:10
枢九 提问者 2020-07-10 14:24:16

前面的银行案例Bank为什么只用到synchronized就可以了呀

好帮手慕小尤 2020-07-10 14:05:54

同学你好,同学是不理解,为什么使用了synchronized还是产生多个消费或多个生产的问题吗?如果是,1. synchronized只是保证同一时刻只有一个线程可以执行某个方法。无法保证线程的执行顺序。所以可以产生多个消费或多个生产的问题。如下所示:

http://img1.sycdn.imooc.com//climg/5f0802b8092acb1002080496.jpg

2. 此时使用wait()方法是为了中断方法的执行,处于等待的状态,使其生产一个消费一个。实现思路如下:

  • 初始flag为false,在get()方法中,if(!flag)为true,消费的线程执行wait()方法,处于等待的状态

  • set()方法中,if(flag)为false,不执行if条件,向下执行,输出生产XX,并设置flag = true;调用notifyAll()方法,唤醒所有线程。

  • 再执行get()方法,此时的flag为true,if(!flag)为false,不执行if条件,向下执行,输出消费XX,再设置flag 为false,以此循环。

http://img1.sycdn.imooc.com//climg/5f08049d091fee6604180498.jpg

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

  • 提问者 枢九 #1
    前面的银行案例Bank为什么只用到synchronized就可以了
    2020-07-10 15:08:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师