`
darrenzhu
  • 浏览: 797425 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

关于synchronized, Lock, Condition

    博客分类:
  • Java
阅读更多
下面的内容摘自《深入理解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的深入理解

    关于`synchronized`与`Lock`的深入理解 `synchronized`是Java中的关键字,用于实现线程同步,确保同一时刻只有一个线程能执行特定代码段,防止数据不一致。它的主要缺陷在于: 1. **不可中断**:当一个线程持有锁...

    JavaLock与Condition的理解Reentran

    在Java并发编程中,Lock接口及其实现类是重要的同步机制,相比传统的synchronized关键字,提供了更细粒度的控制和更高的灵活性。本文将深入探讨JavaLock中的ReentrantLock(可重入锁)以及与其紧密相关的Condition...

    java中的Lock类和Condition类.docx

    通过上述内容,我们可以看出,Lock和Condition类提供了比synchronized更高级别的线程同步和通信机制,使得开发者能够更好地控制线程的执行顺序,提高并发程序的效率和可控性。在实际开发中,根据具体需求选择使用...

    Synchronized与Lock

    4. Lock支持Condition对象,可以创建多个条件,实现更复杂的同步逻辑。 使用Lock接口的一个关键点是,必须记得在finally块中释放锁,以防止异常导致锁无法释放,导致死锁。 总结来说,synchronized是Java中的基本...

    生产者-消费者(lock和condition).zip

    在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...

    Java多线程中ReentrantLock与Condition详解

    ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁等候。ReentrantLock类的主要特点是可以重入,即...

    生产者消费者Java—synchronized 机制

    3. **Condition(条件变量)**:在Java中,`Lock`接口提供了更灵活的条件变量,可以替代`synchronized`和`wait/notify`机制。`Condition`允许我们定义多个条件,每个条件对应一个等待集。然而,这个项目可能仅使用了...

    ReentrantLock与synchronized

    - 分离锁和条件:`ReentrantLock`有`Condition`接口,可以创建多个条件,每个条件对应一个等待队列,提高了线程间的协作能力。 4. **灵活性**: - 更好的控制粒度,可以只锁定需要的部分代码,提高并发效率。 - ...

    第四节(Lock关键字用法)

    在Java编程语言中,`Lock`关键字是多线程编程中的一个重要概念,它提供了一种比内置锁(synchronized)更灵活的同步机制。在深入理解`Lock`关键字的用法之前,我们先来了解一些多线程的基础知识。 多线程是现代...

    Java concurrency之Condition条件_动力节点Java学院整理

    在Java并发编程中,`Condition`接口是Java并发包(java.util.concurrent)中的一个重要组成部分,它提供了比`synchronized`关键字更为精细的线程同步和唤醒机制。`Condition`允许我们创建多个独立的等待队列,每个...

    java 多线程synchronized互斥锁demo

    在Android开发中,由于其运行环境也是基于Java的Dalvik或ART虚拟机,因此上述关于`synchronized`的用法同样适用。 压缩包中的`Long.java`文件可能包含了一个具体的示例,演示了如何使用`synchronized`关键字来控制...

    java 锁 Lock接口详解.docx

    在Java 1.5版本后,引入了`java.util.concurrent.locks`包,其中的`Lock`接口作为同步机制的新选择,弥补了`synchronized`关键字的一些局限性。下面将详细解释`Lock`接口以及与`synchronized`的区别。 `Lock`接口是...

    Lock、Condition实现简单的生产者消费者模式示例

    `Lock`接口提供了比`synchronized`更精细的锁控制,而`Condition`接口则允许我们创建特定条件的等待队列。 首先,我们来看一下`ProducerConsumerDemo`类的核心结构。这个类中有一个`bufferList`列表作为共享资源,...

    Lock详解.pdf

    3. **手动管理**:ReentrantLock需要手动调用lock()获取锁和unlock()释放锁,相比于synchronized的自动管理,这为开发者提供了更精细的控制。 ReentrantLock的内部实现是通过AQS来完成的。AQS是一个抽象的同步器,...

    Lock锁的底层原理完整版

    Lock锁的灵活性相比synchronized更高,它支持手动获取和释放锁,能够中断的获取锁以及超时获取锁。 具体来说,Lock锁有以下主要方法:lock()用于上锁,unlock()用于解锁,tryLock()尝试非阻塞地获取锁,tryLock...

    Java并发编程(20)并发新特性-Lock锁和条件变量(

    相比传统的synchronized关键字,Lock提供了更细粒度的控制,具有更高的灵活性。Lock接口包括以下方法: 1. lock():获取锁,如果锁被其他线程持有,则当前线程等待。 2. lockInterruptibly():与lock()类似,但当...

    生产者消费者Java—LOCK机制

    这个项目为学习和理解Java并发编程提供了很好的实践案例,尤其是关于Lock机制的应用。通过分析和运行此项目,开发者可以深入理解多线程环境下的数据同步和通信,这对于构建高并发的Java应用至关重要。

Global site tag (gtag.js) - Google Analytics