PDF 课件和源代码下载地址:
https://gitee.com/geektime-geekbang/LetsJava
作者回复: t1.join(); t2.join(); 当前执行的线程(比如说t3)先等待t1执行完毕,注意,这时候t2是在执行的,当然,即使不调用t1.join,t1也是在执行的。join只是让t3等待t1、t2,而不是影响t1、t2的执行状态。
作者回复: (-:
作者回复: 数据库就是另外一个世界了。数据库有ACID的属性。而且也基本都有事务的概念。比如对于api4这种,会将对a1,b1,c1的改动放在一个事务里,都成功,事务才会提交成功,有一个失败则事务回滚。 锁还分悲观锁和乐观锁,详细你可以搜索一下。 但是简单来说,改任何数据,都要上锁,或者是在程序里,或者是数据库/存储系统帮你做了,否则肯定有乱套的可能。
作者回复: task2的synchronized (appResource.getResourceInput()) 没有在printer的锁代码块里,也就是说在尝试获取input锁的时候,task2已经释放了printer的锁了。
作者回复: 答案在你后贴的后续代码的回复里
作者回复: 应该是没有上锁,否则在1获取了Printer之后,2是无法获取的。
作者回复: :)
作者回复: jstack,jmap,jhat等等工具,其实不大需要书这种量级的资料。 https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr016.html 这是Oracle官方的命令解释。其实学习这些命令更多的是学习它们背后的知识,比如什么是堆,什么是栈。熟悉了这些知识之后,就可以很自然的顺着官方手册使用工具,解决问题了。