当我们打电话时lock.lock()
或尝试输入synchronized
如果其他线程已经获取了该锁,那么我们的线程就会阻塞。现在我的问题是,当我们查看实施时lock.lock()
它将获取锁委托给 AQS,AQS 实际上会停放当前线程(以便调度程序无法进一步调度它)。
是不是同样的情况synchronized
还堵?
我什至认为我的线程状态也不同。例如,如果我的线程被阻塞synchronized
阻止它将会BLOCKING
如果我打电话lock.lock()
,那么它将是WAITING
。我对吗?
我关心的是以下两种锁定策略在以下方面的区别:Thread.status
通过停车而不是忙着等待来提高性能
-
ReentrantLock.lock();
synchronize { /*some code */ }
BLOCKING - 被资源阻塞,无法中断
WAITING - 被资源阻塞,但可以被中断、通知或取消停放。
正如您所看到的,等待对于另一个处理的控制来说更好。例如如果两个线程死锁,您可以通过中断来打破 lock() 。对于使用同步的两个线程,你会陷入困境。
同步与锁定的行为非常相似,并且具体细节在主要修订之间发生变化。
我的建议是使用
如果你这样做
final Lock lock = new ReentrantLock();
lock.lock();
Thread t = new Thread(new Runnable() {
@Override
public void run() {
try {
lock.lockInterruptibly();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
t.start();
Thread.sleep(100);
System.out.println(t + " is " + t.getState());
lock.unlock();
prints
Thread[Thread-0,5,main] is WAITING
线程状态 http://docs.oracle.com/javase/7/docs/api/java/lang/Thread.State.html states
等待线程的线程状态。由于调用以下方法之一,线程处于等待状态:
- Object.wait 没有超时
- Thread.join 没有超时
- 锁支持.park
处于等待状态的线程正在等待另一个线程执行特定操作。例如,对某个对象调用了 Object.wait() 的线程正在等待另一个线程对该对象调用 Object.notify() 或 Object.notifyAll()。调用 Thread.join() 的线程正在等待指定线程终止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)