zoukankan      html  css  js  c++  java
  • JAVA基础知识(13)-----Lock接口

    Lock接口:多线程在JDK1.5版本升级时,推出一个接口Lock接口。
    解决线程安全问题使用同步的形式,(同步代码块,要么同步函数)其实最终使用的都是锁机制。

    到了后期版本,直接将锁封装成了对象。线程进入同步就是具备了锁,执行完,离开同步,就是释放了锁。
    在后期对锁的分析过程中,发现,获取锁,或者释放锁的动作应该是锁这个事物更清楚。所以将这些动作定义在了锁当中,并把锁定义成对象。

    所以同步是隐示的锁操作,而Lock对象是显示的锁操作,它的出现就替代了同步。

    在之前的版本中使用Object类中wait、notify、notifyAll的方式来完成的。那是因为同步中的锁是任意对象,所以操作锁的等待唤醒的方法都定义在Object类中。

    而现在锁是指定对象Lock。所以查找等待唤醒机制方式需要通过Lock接口来完成。而Lock接口中并没有直接操作等待唤醒的方法,而是将这些方式又单独封装到了一个对象中。这个对象就是Condition,将Object中的三个方法进行单独的封装。并提供了功能一致的方法 await()、signal()、signalAll()体现新版本对象的好处。
    < java.util.concurrent.locks > Condition接口:await()、signal()、signalAll();
    --------------------------------------------------------
    class BoundedBuffer {
    final Lock lock = new ReentrantLock();
    final Condition notFull = lock.newCondition();
    final Condition notEmpty = lock.newCondition();
    final Object[] items = new Object[100];
    int putptr, takeptr, count;
    public void put(Object x) throws InterruptedException {
    lock.lock();
    try {
    while (count == items.length)
    notFull.await();
    items[putptr] = x;
    if (++putptr == items.length) putptr = 0;
    ++count;
    notEmpty.signal();
    }
    finally {
    lock.unlock();
    }
    }
    public Object take() throws InterruptedException {
    lock.lock();
    try {
    while (count == 0)
    notEmpty.await();
    Object x = items[takeptr];
    if (++takeptr == items.length) takeptr = 0;
    --count;
    notFull.signal();
    return x;
    }
    finally {
    lock.unlock();
    }
    }
    }

  • 相关阅读:
    百度贴吧的数据抓取和分析(二):基础数据分析
    百度贴吧的数据抓取和分析(一):指定条目帖子信息抓取
    二十三种设计模式及其python实现
    经典排序算法及python实现
    从开发到部署,使用django创建一个简单可用的个人博客
    使用uWSGI+nginx部署Django项目
    ubuntu中彻底删除nginx
    阿里的秒杀系统是怎么设计的?
    多图详解!10大高性能开发核心技术
    关于Redis的几件小事 | 高并发和高可用
  • 原文地址:https://www.cnblogs.com/ipetergo/p/6623346.html
Copyright © 2011-2022 走看看