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

简介: 并发编程之的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();
        }
    }
}


相关文章
|
Linux 调度 数据库
Linux下的系统编程——线程同步(十三)
Linux下的系统编程——线程同步(十三)
218 0
Linux下的系统编程——线程同步(十三)
|
开发工具 Android开发 Windows
Android sdk下载安装配置教程
Android sdk下载安装配置教程
Android sdk下载安装配置教程
|
存储 关系型数据库 Java
红黑树,B+树,B树的原理
红黑树(Red-Black Tree)、B树(B-Tree)和 B+树(B+ Tree)都是自平衡的树结构,用于高效地进行查找、插入和删除操作。它们在数据库和文件系统等应用中有广泛的应用。
450 2
|
9月前
|
机器学习/深度学习
知识蒸馏技术原理详解:从软标签到模型压缩的实现机制
**知识蒸馏**是一种通过性能与模型规模的权衡来实现模型压缩的技术。其核心思想是将较大规模模型(称为教师模型)中的知识迁移到规模较小的模型(称为学生模型)中。本文将深入探讨知识迁移的具体实现机制。
837 12
知识蒸馏技术原理详解:从软标签到模型压缩的实现机制
|
负载均衡 Dubbo Java
Dubbo服务Spi机制和原理
该文章主要介绍了Dubbo中的SPI(Service Provider Interface)机制和原理,包括SPI的基本概念、Dubbo中的SPI分类以及SPI机制的实现细节。
Dubbo服务Spi机制和原理
分布式系列教程(25) -解决Zookeeper启动失败的问题
分布式系列教程(25) -解决Zookeeper启动失败的问题
658 0
|
Rust JavaScript 前端开发
了不起的Unicode(二)
了不起的Unicode(二)
419 0
|
存储 缓存 NoSQL
轻松突破文件IO瓶颈:内存映射mmap技术
轻松突破文件IO瓶颈:内存映射mmap技术
|
SQL Java 数据库连接
【MyBatis-Plus】快速精通Mybatis-plus框架—核心功能(一)
刚才的案例中都是以id为条件的简单CRUD,一些复杂条件的SQL语句就要用到一些更高级的功能了。
461 0