Thread.join()方法会释放锁还是持续持有锁?
咱们来好好捋一捋Thread.join()和锁的关系:
先看官方API的明确说明:
该实现使用基于this.isAlive条件的this.wait循环调用。线程终止时会调用this.notifyAll方法。建议应用不要在Thread实例上使用wait、notify或notifyAll方法。
从API描述推导的结论:
按照这个实现逻辑,obj.join()内部确实会调用wait()方法——而Java里的wait()方法有个核心特性:调用它的线程会立即释放当前持有的对象锁,所以从这个角度来说,join()在执行过程中是会释放锁的。具体来说,如果当前线程是在持有obj这个Thread实例的锁(比如通过synchronized(obj)块)的情况下调用obj.join(),那内部的wait()会把这个锁释放,直到目标线程终止时触发notifyAll(),当前线程才会重新获取锁并继续执行。关于Stack Overflow上的不同观点:
之前看到有人说join()不会释放任何锁,这个说法其实是混淆了“是否主动获取锁”和“是否释放已持有的锁”。join()本身不会主动去获取任何锁,但如果调用它的线程已经持有了对应Thread实例的锁,那join()内部的wait()操作一定会把这个锁释放掉。额外注意事项:
一定要遵循官方建议,不要在Thread实例上直接调用wait()、notify()或notifyAll()——因为join()的实现已经依赖这些底层的等待/通知机制了,咱们自己调用很可能会干扰join()的正常执行逻辑,导致难以排查的线程问题。
内容的提问来源于stack exchange,提问作者vrinchvucz

