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

关于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

    震惊

    震惊

编辑推荐
1.Lock是一个monitor object. 2.Condition由Lock创建,lock.newCondition(); 3.每个condition后面的
Lock和Condition是为了替代synchroinzed、wait、notify的,有点是更面向对象,功能上也更强大。下面
不管是一个condition 两个condition 三个condition 都需要一个标志未来判定 案例1的 flag 案例2的 c
对于稍微有点经验的.NET开发人员来说,倘若被问及如何保持线程同步,我想很多人都能说好好几种。在
对于稍微有点经验的.NET开发人员来说,倘若被问及如何保持线程同步,我想很多人都能说好好几种。在
对于稍微有点经验的.NET开发人员来说,倘若被问及如何保持线程同步,我想很多人都能说好好几种。在
下面这道题是张孝祥老师整理的java面试宝典中的第28题,由于偶然的原因,看过张老师的视频,我花了8
0.需求 需求是这样的:实现多线程拨号,从数据中的批量读取需要拨打的号码,然后多线程拨号。拨号就
官网上面的加锁介绍不是很详细,我给详细说一下 首先,数据库类型要是InnoDB,其次,加锁必须跟事务
Expression Lists An expression list is a combination of other expressions. expression_list::=
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号