关于synchronized, Lock, Condition

[size=medium]下面的内容摘自《深入理解Java7 核心技术与最佳实践》,作者:成富

Lock接口替代Synchronized关键词,相对应的Condition接口替代Object类的wait, notify和notifyAll方法。就如同使用wait,notify和notifyAll方法时不能脱离synchronized关键词一样,使用Condition接口时也需要与一个对应的Lock接口的实现对象关联起来。通过Lock接口的newCondition方法可以创建新的Condition接口的实现对象。在调用Condition接口的方法之前,也需要使用Lock接口的方法来取锁。

Condition接口提供了多个类似Object类的wait方法的方法,最基本的是await方法,调用该方法会使当前线程进入等待状态,直到被唤醒或被中断。另外一种await方法的重载形式可以指定超时时间。方法awaitNanos以纳秒数为单位指定超时时间,只不过指定的不是要经过的时间,而是超时发生的时间点,参数是一个java.util.Date类的对象。前面几种等待方法都会响应其他线程发出的中断请求,而awaitUninterruptibly方法则不会处理中断请求。如果线程通过调用awaitUninterruptibly方法进入等待状态,那么,当收到中断请求时,线程仍然会继续处于等待状态,直到被唤醒。当线程从awaitUninterruptibly方法返回时,其内部的中断标记会被设置,以表明曾经有中断请求发生。与Object类的wait方法相同,当线程由于调用await等方法进入等待状态时,会释放其持有的锁。

与Condition接口中的等待方法相对应的是signal和signalAll方法,相对于Object类中的notify和notifyAll方法。这两个方法的含义与notify和notifyAll方法是相同的。

Lock接口和Condition接口的一般使用方式[/size]

Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();

lock.lock();
try{
while(/**logic condition is not satisfied*/) {
condition.await();
}
}finally {
lock.unlock();
}


[size=medium]Wait方法的一般使用方式[/size]

synchronized (obj) {
while(/*逻辑条件不满足*/) {
obj.wait();
}
//条件满足
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值