PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: 会释放锁,但是因为后面的代码依旧在synchronized块里,如果想继续执行,必须再次抢到锁
作者回复: 对头,多线程就是乱。synchronized是我想静静
作者回复: 也是可以的,锁嘛,只要需要锁的地方用的是同一个对象就可以。
作者回复: 1)建议用notifyAll。至于会不会有notify在wait前面,只要是大家在循环不停的wait和notifyall,应该就不会有死锁 2)在你上个问题里回答啦 3)使用多线程让的窍门就是尽量不使用。如果要使用,就把线程运行模型理清楚:哪批线程干了什么事,之间怎么同步的。当然,最好是不要用,别玩太花的技巧😄
作者回复: while放在里面其实就不会主动释放锁了。虽然wait的时候会释放锁,但是把process也包在sync里面了。这个就是浪费锁了。别的线程都在等这个线程process task,其实是没必要的。
作者回复: 问题没有对错。能解决问题就是好的。如果两个人解决问题的思路相似,那么不稀奇。如果相同,那就肯定是抄的。 回到你的解决方案。问题1其实没有给方案,给了分析。其实堆里的数据也不都是共享的。你得先有对象的引用,才能操作这个对象。而且要操作的东西还得是public的才方便。 问题2的方案🉑️ 问题3的方案也🉑️
作者回复: 正常的,消费者线程会循环的去“抢”任务来做。只要不停止,消费者线程就会反反复复拿到任务,输出自己的线程名字
作者回复: wait方法是Object类的方法,线程一旦执行到这个方法,就会等待,直到别的线程调用这个对象的notify方法。 这里有线程,对象,两个角色。线程执行代码,对象提供数据(包括wait和notify这俩方法背后的锁),不同的线程可以操作相同的数据
作者回复: 1)锁是和task list对应的。保护的是不能有多个thread对这个list进行操作。否则就会有问题,不能一边执行add里的代码,一边执行remove里的代码,也不能同时执行add或者remove的代码,这些都会修改list的内部状态,同时多个线程去修改会有问题。 2)notifyAll是一个最佳实践,防止notify出现死锁。举个例子,因为notify是随便选择一个去唤醒的,那么就有可能是生产者的notify只唤醒了生产者,那么生产者就wait了,就释放锁了,但是如果在wait前没有notify消费者,那么就大家都在wait了,就死锁了。 简单来说,notify的行为可能会导致死锁,原因是它依赖被notify的线程执行的代码在wait前,有没有继续notify别的线程。
作者回复: queue虽然是个接口,但是它的引用指向的是实际实现了这个接口的对象。调用的方法也是实际对象所对应的类里的方法。