在Java中,这样做ReentrantLock.lock()并ReetrantLock.unlock()使用相同的锁定机制synchronized()?
ReentrantLock.lock()
ReetrantLock.unlock()
synchronized()
我的猜测是“不”,但我希望是错的。
例:
想象一下,线程1和线程2都可以访问:
ReentrantLock lock = new ReentrantLock();
线程1运行:
synchronized (lock) { // blah }
线程2运行:
lock.lock(); try { // blah } finally { lock.unlock(); }
假设线程1首先到达其部分,然后在线程1完成之前到达线程2:线程2将等待线程1离开该synchronized()块,还是继续运行?
不,lock()即使线程1 synchronized在同一线程上,线程2也可以lock。这是文档必须说的:
lock()
synchronized
lock
请注意,Lock实例只是普通对象,它们本身可以用作同步语句中的目标。获取Lock实例的监视器锁与调用该实例的任何lock()方法没有指定的关系。建议避免混淆,除非在自己的实现中使用,否则不要以这种方式使用Lock实例。