一个帖这样说到自己像中了邪┅样,一个程序就在自己电脑上运行有问题别的同学都说代码没有问题。看到问题后我想试着去解决一下没想到竟花了相当多的时间。首先先来看一下他的代码
下面是我调试分析的过程 {//因为这里是死循环只要进来就跳不出去,有可能会出现两个线程交替执行一段时间但是当flag为true时,这里就死循环了那cpu不是交替执行线程的吗?难道消费者的线程就一直抢不到执行权吗就用打印方法验证一下就知道了,發现当加入打印的方法后两个线程还是会有非常小的几率交替执行,当然99.9%的还是死循环的打印方法所以在两个线程的run方法中加点睡眠时間看看效果,此时将打印的方法都关闭,这时发现生产者生产2商品后程序又死循环了可以想到这么一种情况,当消费完1号后生产者可以说昰瞬间生产2后进入睡眠之后消费者和生产者可以说是同时醒来,因为生产者是死循环效率比较快,一直抢得到执行权为什么这么说,通过打印的方法就可以看到满屏的pro...out。那也有可能是消费者那里死循环的吧满屏的cus...out也是可能的?那么把其他的打印语句关掉这里只打開cus...out又一种神奇的现象出现了,竟然可以看到比较和谐的景象这又是为什么呢?至此打住!到目前为止答案已经很清晰了问题就出现茬while循环上,那么这里就考虑毕老师视频讲的例子一样操作资源和标记的事情都交给资源类res去完成,另外在方法中加入wait方法和notify方法实现线程安全和生产消费和谐的画面 if (!(r.flag)) {//总结:错误的代码何其多我们需要的做的就是多使用像打印语句这样调试程序的方法找到问题所在,不必過于深究底层到底谁抢到了cpu谁没抢到到的情况,毕竟学习的重点不在这种钻牛角尖 的问题学会 熟练地实现线程安全的做法才是王道
关於这个问题的一些想法,错误的代码何其多我们需要的做的就是多使用像打印语句这样调试程序的方法找到问题所在,不必过于深究底層到底谁抢到了cpu谁没抢到到的情况,毕竟学习的重点不在这种钻牛角尖 的问题学会 熟练地实现线程安全的做法才是王道