在JDK1.5后,并发包里新增了Lock接口以及其实现类来实现锁功能,它提供了与synchronized关键字类似的锁功能,但它需要手动开启、关闭锁。虽然看起来没有synchronized方便,但它可以支持锁的可操作性,可中断获取,超时获取等多种非常使用的同步机制,下面主要围绕重入锁、读写锁展开

1、Lock接口的api

  1、void lock()获取锁,调用该方法当前线程获取锁,获取锁之后返回

  2、void lockInterruptibly() throws interruptedException可中断获取锁,与lock方法不同在于该方法可影响中断,既在锁的获取过程中可中断当前线程

  3、boolean tryLock()尝试非阻塞获取锁,调用方法立即返回,返回true为成功

  4、boolean tryLock(long time,TimeUnit unit) throws interruptedException 超时获取锁,一下情况会返回:时间内获取到了锁、时间内被中断、时间到了没有获取锁

  5、void unLock()释放锁

2、ReentrantLock重入锁(排它锁)

  它支持重进入的锁,即该锁支持同一个线程对共享资源重复进入加锁,还支持获取锁的公平、非公平的选择(在绝对时间上,先对锁进行索取的请求一定先被满足,那么这个锁就是公平的,反之就是不公平的。非公平锁效率高于公平锁,ReentrantLock默认是非公平锁)

应用场景如下:

1、如果发现该操作已经在执行中则不再执行(有状态执行)

如定时任务发现前一个尚未执行完,则本次直接返回不再执行

  private ReentrantLock lock=new ReentrantLock();

  if(lock.tryLock()){//如果已经被占用则直接返回false不会等待,达到忽略操作的效果

    try{}finally{

      lock.unLock();

    }

  }

2、如果发现有在执行的,那么等待一个一个执行

   ReentrantLock lock=new ReentrantLock();//非公平锁,默认为false

   ReentrantLock lock=new ReentrantLock(true);//公平锁,跟synchronized一致  

   try{

    lock.lock();//如果锁被占用那么会等待,直到锁被释放

   }finally{

    lock.unLock();

   }

3、如果发现有锁被占用,那么则等待指定时间,如果等待超时则不执行

  可有效防止一致等待导致死锁

  try{

    if(lock.tryLock(5,TimeUnit.SECONDS)){//发现被占用则最大等待5秒,5秒内执行完可占用该锁,执行不完返回false

      try{}finally{

        lock.unLock();

      }

    }

  }catch(InterruptedException e){}

4、如果发现被占用,则可中断正在进行的操作,释放该锁继续下一个操作

  可有效防止锁被长时间占用,对资源的长时间消耗

  try{

    lock.lockInterruptibly();

  }catch(InterruptedException e)finally{

    lock.unLock();

  }

3、ReentrantReadWriteLock(读写锁,共享锁)

  排他锁:读写互斥、读读互斥、写写互斥

  共享锁:读读共享、读写互斥、写写互斥

  JDK1.5读写可能出现死锁,建议1.6以上

  

  

Lock详解的更多相关文章

  1. C++11 并发指南三(Lock 详解)(转载)

    multithreading 多线程 C++11 C++11多线程基本使用 C++11 并发指南三(Lock 详解) 在 <C++11 并发指南三(std::mutex 详解)>一文中我们 ...

  2. C++11 并发指南三(Lock 详解)

    在 <C++11 并发指南三(std::mutex 详解)>一文中我们主要介绍了 C++11 标准中的互斥量(Mutex),并简单介绍了一下两种锁类型.本节将详细介绍一下 C++11 标准 ...

  3. FLUSH TABLE WITH READ LOCK详解

    FLUSH TABLES WITH READ LOCK简称(FTWRL),该命令主要用于备份工具获取一致性备份(数据与binlog位点匹配).由于FTWRL总共需要持有两把全局的MDL锁,并且还需要关 ...

  4. JAVA中synchronized和lock详解

         目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...

  5. MySQL Metadata Lock详解

    Metadata Lock 的作用: 要直接说出Metadata Lock 的作用.以我目前的文字功底是不行的.好在我可以通过一个例子来说明. 假设session 1 在正在执行如下的SQL语句 se ...

  6. 【java多线程】ConCurrent并发包 - Lock详解

    synchronized的缺陷   我们知道,可以利用synchronized关键字来实现共享资源的互斥访问. Java 5在java.util.concurrent.locks包下提供了另一种来实现 ...

  7. ConCurrent并发包 - Lock详解(转)

    synchronized的缺陷   我们知道,可以利用synchronized关键字来实现共享资源的互斥访问.Java 5在java.util.concurrent.locks包下提供了另一种来实现线 ...

  8. 详解synchronized与Lock的区别与使用

    知识点 1.线程与进程 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需要一个线程.关系是线程–>进程–>程序的大致组成结构.所以线程是程序执行流的最小单位 ...

  9. 【C/C++开发】C++11 并发指南三(std::mutex 详解)

    本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C ...

随机推荐

  1. GIT 初始化 中文编码、自动换行

    解决中文编码: git config --global core.quotepath false git config --global gui.encoding utf-8 解决git log 中文 ...

  2. 洛谷P1073 最优贸易

    题面要求的是一个差值,即走过一条路径能找到的路径上最大值-最小值. 那么相当于跑一遍最长路和一遍最短路,当然不是概念上的最长路最短路,这里把dis[v]的松弛改成用路径上传递来的最大/最小值维护,而不 ...

  3. 实训任务05 MapReduce获取成绩表的最高分记录

    实训任务05  MapReduce获取成绩表的最高分记录 实训1:统计用户纺问次数 任务描述: 统计用户在2016年度每个自然日的总访问次数.原始数据文件中提供了用户名称与访问日期.这个任务就是要获取 ...

  4. 重新复习~ 为了重新找工作 - > XMLHttpRequest2.0 Jsonp nodeType 节点 webpack基本搭建 闭包的一句话总结

    XMLHttpRequest2.0 1.可以设置超时 (xhr.timeout = 1000; ontimeout()函数) 2.支持FormData对象管理表单数据(new FormData 方法: ...

  5. complex类的定义和实现

    #include<iostream> #include<cmath> using namespace std; class complex { public: complex( ...

  6. windows分驱

    步骤/方法   1 鼠标右击“计算机” 2 选择“管理”标签 3 打开“计算机管理”窗口   选择“磁盘“>>”存储管理“,打开”磁盘管理“页面 如图:   右键单击选择要压缩的磁盘(本例 ...

  7. 机器学习之朴素贝叶斯&贝叶斯网络

    贝叶斯决决策论       在所有相关概率都理想的情况下,贝叶斯决策论考虑基于这些概率和误判损失来选择最优标记,基本思想如下: (1)已知先验概率和类条件概率密度(似然) (2)利用贝叶斯转化为后验概 ...

  8. wps实现自动编码

    1.打开wps,点击“开始”菜单,选择“标题1”样式,右键选择“修改样式” 2.在修改样式界面,左键点击“格式”选择“编号”选项 3.在打开的界面选择“多级编码”,选中一个样式,点击“自定义”按钮 4 ...

  9. tcl实现批量压缩文件夹

    tcl脚本本身对字符串的处理比较简单,所以想着用这个也实现下: proc main {} { puts "请输入路径:" set strpath "E:\\123&quo ...

  10. 简单网络管理协议(SNMP)

    SNMP是TCP/IP网络中应用最为广泛的网络管理协议,工作在TCP/IP参考模型的应用层,是一种面向无连接的协议 功能:SNMP的功能是使网络设备之间能方便的交换管理信息,从而使网络管理员了解网络运 ...