在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. redis学习——数据持久化

    一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内存中的数据持久 ...

  2. python学习------迭代器协议和生成器

    一.递归和迭代 递归:自己调用自己 举例解释:问路   A问B康明网络科技怎么走,B说我不是很清楚,我帮你问问C,C说我也不知道.我问问D,D说 就在兴隆.之后D返回结果给C,C返回结果给B,B返回结 ...

  3. layui从子iframe打开父iframe的tab选项卡

    数据表格字段: {field: 'novelId', title: '小说ID',width:100,templet: '<div><a href="javascript: ...

  4. mybatis源码解析之Configuration加载(三)

    概述 上一篇我们主要分析了下<environments>标签下面,transactionManager的配置,上问最后还有个遗留问题:就是在设置事物管理器的时候有个autocommit的变 ...

  5. dsp 28335 ConfigCpuTimer()详细介绍

    我自己的理解:写的不一定对,还请多指教: 从网上看到的好多都是复制粘贴的一个版本,感觉不太对 图上的是系统时钟(SYSCLKOUT)=75MHz; ConfigCpuTimer(&CpuTim ...

  6. better-scroll

    better-scroll会将默认事件阻止掉,如果自己写的部分需要有点击事件,需要在参数里加上click:true. 同时,在PC上或某些手机端,由于未成功将touchend事件move掉,点击事件会 ...

  7. 转自:阮一峰 Git远程操作详解

      对于git的一些指令还是有些生疏,而且在课堂上讲的只是简单介绍了一些功能,并没有具体深入,看到这篇文章之后,觉得比较详细,所以转了过来. Git是目前最流行的版本管理系统,学会Git几乎成了开发者 ...

  8. java ftp上传文件 工具类

    package com.learning.spboot.utils; import com.jcraft.jsch.*; import org.apache.commons.net.ftp.FTPCl ...

  9. c#错误cs0006

    生成解决方案时报“error CS0006: Metadata file '.../.../.../xxx.dll'could not be found". 错误列表-下拉框选择整个解决方案 ...

  10. 201771010141 周强《面向对象程序设计(java)》第十三周学习总结

    实验目的与要求 (1) 掌握事件处理的基本原理,理解其用途: (2) 掌握AWT事件模型的工作机制: (3) 掌握事件处理的基本编程模型: (4) 了解GUI界面组件观感设置方法: (5) 掌握Win ...