• 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如下 :

      

  • 相关阅读:
    进程、线程和协程的区别(转)
    IO多路复用机制(转)
    防火墙及其功能(转)
    TCP连接的建立和终止。
    TCP和UDP细致刻画,区别。
    typename T和class T区别与联系
    TCP UDP的详解开始 ----UNIX网络编程
    关于UNIX网络编程的的OSI,1.7章的总结
    UNIX网络编程daytime服务端和客户端的实现过程
    linux shell脚本执行错误:bad substitution
  • 原文地址:https://www.cnblogs.com/dquery/p/6169421.html
Copyright © 2020-2023  润新知