`
uule
  • 浏览: 6353026 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

Lock的await/singal 和 Object的wait/notify 的区别

 
阅读更多

在使用Lock之前,我们都使用Object 的wait和notify实现同步的。举例来说,一个producer和consumer,consumer发现没有东西了,等待,produer生成东西了,唤醒。

线程consumer 线程producer
synchronize(obj){ 
    obj.wait();//没东西了,等待
}
synchronize(obj){ 
    obj.notify();//有东西了,唤醒
}

有了lock后,世道变了,现在是:

lock.lock(); 
condition.await(); 
lock.unlock();
lock.lock(); 
condition.signal(); 
lock.unlock();

为了突出区别,省略了若干细节。区别有三点:

  1.  lock不再用synchronize把同步代码包装起来
  2.  阻塞需要另外一个对象condition
  3.  同步和唤醒的对象是condition而不是lock,对应的方法是await和signal,而不是wait和notify

为什么需要使用condition呢?简单一句话,lock更灵活。以前的方式只能有一个等待队列在实际应用时可能需要多个,比如读和写。为了这个灵活性,lock将同步互斥控制和等待队列分离开来,互斥保证在某个时刻只有一个线程访问临界区(lock自己完成),等待队列负责保存被阻塞的线程(condition完成)。

通过查看ReentrantLock的源代码发现,condition其实是等待队列的一个管理者,condition确保阻塞的对象按顺序被唤醒。

在Lock的实现中,LockSupport被用来实现线程状态的改变,后续将更进一步研究LockSupport的实现机制。

分享到:
评论

相关推荐

    Java学习资料-详解Condition的await和signal等待/通知机制

    在Java多线程编程中,`Condition`是Java并发包`java.util.concurrent.locks`中的一个接口,它提供了比`Object`类中的`wait()`、`notify()`和`notifyAll()`更加灵活和强大的线程间通信机制。`Condition`与`Lock`配合...

    wait,notify等线程知识.pdf

    `Condition` 提供了 `await()` 和 `signal()` 方法来替代 `wait` 和 `notify`。 **示例代码:** ```java Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); lock.lock(); try { ...

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    await()、signal()和signalAll()是java.util.concurrent包下的Condition类的方法,它们也用于线程间的协调,但提供了比Object的wait()、notify()更为灵活的机制。 - await():使线程在Condition上等待,同时释放...

    java生产者消费者模式

    2. **await() / signal()方法**:这是Java Concurrency API中Lock接口的子接口Condition提供的方法,比wait() / notify()更具有可读性和安全性。使用时,需要先获取Lock,然后在特定条件下调用await()等待,signal()...

    Java JDK1.5 生产消费者模式解决方案

    总的来说,使用`Lock`和`Condition`实现的生产者消费者模式相比传统的`synchronized`和`wait()`/`notify()`,在代码可读性、灵活性和性能上都有所提升。这使得开发者能够更高效、更可控地处理并发问题。在JDK 5.0...

    Java异步调用转同步方法实例详解

    Java中将异步调用转换为同步调用有多种方法,本文将详细介绍五种方法:使用wait和notify方法、使用条件锁、使用Future、使用CountDownLatch、使用CyclicBarrier。 1. 使用wait和notify方法 wait和notify方法是...

    java多线程系列(四)ReentrantLock的使用.docx

    这与`Object`类的`wait()`、`notify()`和`notifyAll()`方法类似,但`ReentrantLock`的唤醒机制更为明确,可以指定唤醒哪个条件的线程,而`Object`的唤醒是随机的。 5. **锁的状态查询**:`ReentrantLock`提供了`...

    juc-1(2).docx

    在示例中的 `Signal` 类中,可能包含一个 `Lock` 实例,如 `ReentrantLock`,以及对应的 `Condition` 对象,通过 `condition.await()` 和 `condition.signal()` 方法来实现线程间的协调通信。 总结来说,JUC 包为...

    Java面试题线程部分.docx

    线程间的通信通常通过wait、notify、notifyAll、await、signal和signalAll等方法实现,确保线程之间的协作和资源的有序访问。线程同步和互斥是并发编程中的重要概念,互斥是指对共享资源的独占访问,同步则是控制多...

    java并发编程-AQS和JUC实战

    - **特点**:相比 `Object.wait()` 和 `Object.notify()`,`LockSupport` 提供了更多的灵活性和控制能力。 ### 结论 以上介绍了 Java 并发编程中几个重要的概念和技术,包括 `ReentrantLock`、`Condition`、`...

    Java中ReentrantLock的使用.docx

    Condition的等待和唤醒操作比Object的wait/notify更安全,因为它们只能在已获取锁的上下文中执行,减少了死锁和竞态条件的风险。 ReentrantLock的这些特性使得它在某些复杂的并发场景下更为适用,例如,当需要精确...

    队列分享-易群1

    这种设计简化了线程间的同步和通信,避免了显式使用`synchronized`关键字和`wait/notify`机制。 `BlockingQueue`接口提供了多种操作方法,这些方法大致可以分为四类: 1. 抛出异常:当无法立即完成操作时,如`put...

    Java编程中实现Condition控制线程通信

    总结来说,Condition在Java多线程编程中提供了更强大的线程通信能力,使得我们可以更精确地控制线程的等待和唤醒,避免了使用wait/notify机制的一些限制。通过熟练掌握Condition的使用,开发者可以编写出更加高效和...

    H:\大java后台笔记\蚂蚁课堂面试宝典\2018年蚂蚁课堂(每特教育)-Java工程师面试宝典-V1.0.docx

    - 它可以替代传统`Object`的`wait()`和`notify()`方法。 #### 四、线程管理 - **如何停止线程**: - 使用退出标志,使线程正常退出。 - 使用`interrupt()`方法中断线程。 - 不建议使用`stop()`方法强制停止...

Global site tag (gtag.js) - Google Analytics