Java中的Lock

  同步机制是Java并发编程中最重要的机制之一,锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能防止多个线程同时访问共享资源(但是也有例外,比如读写锁)。Java中可以使用synchronized关键字实现锁的功能,用synchronized修饰的方法或者代码块,在锁和获取和释放时隐式的,这给我们的操作带来了更好的便捷性。Lock接口是JAVA SE 5之后新增的接口,它提供了与synchronized关键字类似的同步功能,只是在使用的时候需要显示的获取锁和释放锁,但是却拥有了锁释放和锁获取的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。

  synchronized关键字隐式的获取与释放锁将锁的获取与释放固化了,这种方式简化了同步的管理,但是可扩展性没有显示的锁获取与释放更方便,例如,在一个场景中,先获得锁A,然后再获取锁B,当锁B获得后,释放锁A同时获取锁C,当锁C获得后,再释放B的同时据偶去锁B,一次类推。这样的场景下,synchronized关键字就没有那么容易实现了,而使用Lock却非常的方便。

  Lock的使用非常的简单,下面是Lock的使用方式示例 :

Lock lock = new ReentrantLock() ;
lock.lock() ;
try{
    //do something   
  
}finally{
   lock.unlock() ;  
}

  在finally块中释放锁,能保证在每次获取锁之后,最终都能被释放。要注意的是,不要将锁的获取写在try块中,因为如果在获取锁(自定义锁的实现)时发生了异常,异常抛出的同时,也会导致锁无故的释放。

  Lock接口对于synchronized的优势主要有以下几点 :

  (1)尝试非阻塞的获取锁     ,当前线程尝试获取锁,如果这一时刻没有被其他线程获取到,则成功获取并持有锁

  (2)能被中断的获取锁       ,我们知道synchronized关键字修饰的代码块或者方法,阻塞队列中的线程是不会响应中断的。Lock则不同,获取到锁的线程被中断时,中断异常会被抛出,同时释放锁。

  (3)超时释放锁,在指定的截止时间之前获取锁,如果超时未获取到,则返回 。

  Lock是一个接口,它定义了锁获取与释放的基本操作,Lock的API如下 :

  

posted @ 2016-12-13 12:53  dquery  阅读(195)  评论(0编辑  收藏  举报