java锁lock的使用

  • Post author:
  • Post category:java




java.util.concurrent.locks

Interfaces and classes providing a framework for locking and waiting for conditions that is distinct from built-in synchronization and monitors.接口和类提供了用于锁定和等待条件的框架,这些条件不同于内置的同步和监视器。

  1. 使用Lock 中的tryLock方法尝试获得锁(非阻塞形式)
//仅在调用时锁空闲(释放)时才获取锁。
//获取锁(如果有)并立即返回true值。 如果锁不可用,则此方法将立即返回false值。        
        Lock lock=new ReentrantLock();
        //使用tryLock方法尝试获取锁
        //tryLock不阻塞(如果获得了锁,则返回为true;否则为false)
        if (lock.tryLock()){
            //获取锁时 保证能够释放锁,没有获取锁时不会释放锁
            try {
                System.out.println("对受保护的资源进行操作");
            }finally {
                lock.unlock();
            }
        }
  1. 使用具有超时时间的tryLock方法尝试获得锁
//如果锁在给定的等待时间内是空闲的,并且当前线程尚未中断,则获取该锁
        Lock lock = new ReentrantLock();
        //使用tryLock方法尝试获取锁
        try {
            //10秒超时
            if (lock.tryLock(10, TimeUnit.SECONDS)) {
                //获取锁时 保证能够释放锁,没有获取锁时不会释放锁
                try {
                    System.out.println("对受保护的资源进行操作");
                } finally {
                    lock.unlock();
                }
            }
        } catch (InterruptedException exception) {
            System.out.println("尝试获得锁时中断");
        }
  1. 使用lock方法获取锁(阻塞形式)
//获取锁
//如果该锁不可用,则出于线程调度目的,当前线程将被禁用,并处于休眠状态,直到获得该锁为止。
        Lock lock = new ReentrantLock();
        lock.lock();
        try {
            System.out.println("修改受保护的资源");
        } catch (Exception e) {
            //回滚try中的操作或者将受保护的资源改成合适的状态值
            e.printStackTrace();
        } finally {
            lock.unlock();
        }
  1. 使用condition条件来等待和唤醒(生产者和消费者)
    final Lock lock = new ReentrantLock();
    final Condition customer = lock.newCondition();
    final Condition producer = lock.newCondition();
    //消息内容
    String message = null;
    //生产者
    public void put(String mes) throws InterruptedException {
        lock.lock();
        try {
            while (message != null) {
                producer.await();
            }
            message = mes;
            customer.signal();
        } finally {
            lock.unlock();
        }
    }
    //消费者
    public String take() throws InterruptedException {
        lock.lock();
        try {
            while (message == null) {
                customer.await();
            }
            String res = message;
            message = null;
            producer.signal();
            return res;
        } finally {
            lock.unlock();
        }
    }



版权声明:本文为u013421874原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。