并发编程之的await和signal等方法的详细解析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 并发编程之的await和signal等方法的详细解析

await() signal() 和 signalAll()、wait() 与 await()

wait() 和 sleep() 的区别

  1. 都是线程同步时会用到的方法,使当前线程暂停运行,把机会交给其他线程
    2.如果任何线程在等待期间被中断都会抛出InterruptedException
    3.都是native() 方法

异:

  1. wait() 是Object超类中的方法;而sleep()是线程Thread类中的方法
  2. 对锁的持有不同,wait()会释放锁,而sleep()并不释放锁
  3. 唤醒方法不完全相同,wait() 依靠notify或者notifyAll 、中断、达到指定时间来唤醒;而sleep()到达指定时间被唤醒.
  4. 使用位置不同,wait只能在同步代码块或同步控制块中使用,而sleep可以在任何位置使用。

await() signal() 和 signalAll()

java.util.concurrent类库中提供的Condition类来实现线程之间的协调。

在Condition上调用 await() 方法使线程等待,其他线程调用signal() 或 signalAll() 方法唤醒等待的线程。

ReentrantLock里面默认有实现newCondition()方法,新建一个条件对象。

使用Lock来获取一个Condition对象,使用重入锁ReentrantLock。

wait() 与 await()

  1. wait()是Object超类中的方法,而await()是ConditionObject类里面的方法.
  2. await会导致当前线程被阻塞,会释放锁,这点和wait是一样的
  3. await中的lock不再使用synchronized把代码同步包装起来
  4. await的阻塞需要另外的一个对象condition
  5. notify是用来唤醒使用wait的线程;而signal是用来唤醒await线程。
  6. ==所在的超类不同使用场景也不同,wait一般用于Synchronized中,而await只能用于ReentrantLock锁

await和signalAll案例

await和signalAll都是Condition类中的方法

  • synchronized 中 可以使用的是wait和notify
  • 而在lock同步锁中 只能使用 await 和signal
class Resource{
    private int number = 0;
    private Lock lock = new ReentrantLock();
    private Condition condition = lock.newCondition();
    //number++
    public void increment() throws InterruptedException {
        lock.lock();
        try {
            while(number != 0){
                condition.await();
            }
            number++;
            System.out.println(Thread.currentThread().getName()+":"+number);
            condition.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
    //number--
    public  void decrement() throws InterruptedException {
        lock.lock();
        try {
            while(number == 0){
                condition.await();
            }
            number--;
            System.out.println(Thread.currentThread().getName()+":"+number);
            condition.signalAll();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
    }
}


相关文章
|
2月前
|
C# UED
C#一分钟浅谈:异步编程基础 (async/await)
在现代软件开发中,异步编程对于提升应用性能和响应性至关重要,尤其是在处理网络请求和文件读 异步编程允许程序在等待操作完成时继续执行其他任务,从而提高用户体验、高效利用资源,并增强并发性。在 C# 中,`async` 用于标记可能包含异步操作的方法,而 `await` 则用于等待异步操作完成。 示例代码展示了如何使用 `async` 和 `await` 下载文件而不阻塞调用线程。此外,本文还讨论了常见问题及解决方案,如不在 UI 线程上阻塞、避免同步上下文捕获以及正确处理异常。
51 0
|
6月前
|
Java
Java多线程基础-7:wait() 和 notify() 用法解析
这篇内容探讨了Java中的`wait()`和`notify()`方法在多线程编程中的使用。
39 0
|
6月前
|
设计模式 编解码 程序员
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
563 2
探索 C++ 20 (co_await、co_yield 和 co_return)协程基本框架的使用
|
6月前
并发编程之的await和signal等方法的详细解析
并发编程之的await和signal等方法的详细解析
33 0
|
6月前
|
C#
C#学习系列相关之多线程(四)----async和await的用法
C#学习系列相关之多线程(四)----async和await的用法
|
6月前
|
调度 Python
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
什么是Python中的协程(Coroutine)?如何使用`async`和`await`进行协程编程?
75 0
|
12月前
|
vr&ar Swift
大师学SwiftUI第9章Part 1 - 异步并发之Task、Async、Await和错误
苹果系统借助现代处理器的多核可同步执行多条代码,提升同一时间内程序所能执行的任务。例如,一段代码从网上下载文件,另一段代码可以在屏幕上显示进度。此时,我们不能等待第一个执行完后再执行第二个,而必须要同步执行这两个任务。
171 0
C#多线程(18):一篇文章就理解async和await
C#多线程(18):一篇文章就理解async和await
260 0
C#多线程(18):一篇文章就理解async和await
线程 - wait、await 区别
线程 - wait、await 区别
335 0
|
安全 Java 调度
【小家java】并发编程中wait/notify await/singal notify/notifyAll sleep/yield 的区别以及死锁案例(下)
【小家java】并发编程中wait/notify await/singal notify/notifyAll sleep/yield 的区别以及死锁案例(下)