在测试java多线程中有关 “生产者和消费者” 这个经典问题的时候,写代码测试的时候,思考到一些问题(所以还是要动手,实践才能储真知啊),
synchronize 同步锁何时释放,何时获得?重新获得锁资源之后,代码时从哪里开始继续执行的呢?
了解到,锁用到的对象上上面原来有两种池, 1)对象的锁池, 2)对象的等待池。
- 执行线程sleep: 不会释放cpu资源,也不会释放锁资源。
- 执行wait: 释放cpu资源,也会释放锁资源。
所以总结有:
在Java对象中,有两种池
琐池-----------------------synchronized
等待池---------------------wait(),notify(),notifyAll()
- 如果一个线程调用了某个对象的wait方法,那么该线程进入到该对象的等待池中(并且已经将锁释放),
- 如果未来的某一时刻,另外一个线程调用了相同对象的notify方法或者notifyAll方法,
- 那么该等待池中的线程就会被唤起,然后进入到对象的锁池里面去获得该对象的锁,
- 如果获得锁成功后,那么该线程就会沿着wait方法之后的路径继续执行。注意是沿着wait方法之后
其他答案:
wait中的线程是不会去竞争对象锁的。 据我所知,开始由于调用了对象的wait方法,线程处于该对象的等待池中,
而后,只