当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

关于synchronized, Lock, Condition

发表于: 2014-03-23   作者:darrenzhu   来源:转载   浏览:
摘要: 下面的内容摘自《深入理解Java7 核心技术与最佳实践》,作者:成富 Lock接口替代Synchronized关键词,相对应的Condition接口替代Object类的wait, notify和notifyAll方法。就如同使用wait,notify和notifyAll方法时不能脱离synchronized关键词一样,使用Condition接口时也需要与一个对应的Lock接口的实现对象关联起
下面的内容摘自《深入理解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接口的一般使用方式

		Lock lock = new ReentrantLock();
		Condition condition = lock.newCondition();
		
		lock.lock();
		try{
			while(/**logic condition is not satisfied*/) {
				condition.await();
			}
		}finally {
			lock.unlock();
		}


Wait方法的一般使用方式
synchronized (obj) {
    while(/*逻辑条件不满足*/) {
        obj.wait();
    }
    //条件满足
}

关于synchronized, Lock, Condition

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号