在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. 《程序设计入门——C语言》翁恺老师 第四周编程练习记录

    1 奇偶个数(5分) 题目内容: 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据.程序输出读到的数据中的奇数和偶数的个数. 输入格式: 一系列正整数,整数的范围是(0,1 ...

  2. 记录PHP的执行时间

    网上不少误导信息,实际上这个答案在PHP源码中的Zend文件夹下bench.php是有的 在此纠正下网络上复制粘贴造成的错误.希望后来人少踩点坑. function getmicrotime() { ...

  3. 比较爬虫用的语言Python与Go

    Python是我比较喜欢的语言,莫名的喜欢,对Python的学习可能起初是敲错了网址开始的,哈哈哈~ 工作的任务从一个网站后台做登录.爬取数据,写入服务器Redis中,同事认为我会用PHP来写,哼!让 ...

  4. 如何启动linux的telnet服务--转载

    如何启动linux的telnet服务 如何启动linux的telnet服务 步骤如下: 1.如果安装了telnet.telnet-server的rpm包,就跳到2.,否则安装这个包. 2.修改teln ...

  5. volatile 与 JVM 指令重排序

    前言: 在做单例模式时 有博客在评论区 推荐使用 volatile 关键字 进行修饰 然后用了两天时间查资料看文档 发现涉及的面太广 虽然已经了解为什么要使用 volatile + synchroni ...

  6. [转载]一个高效简洁的Aseprite to Unity导入工具

    原文链接 https://zhuanlan.zhihu.com/p/28644268  期待原作者上传至AssetStore. 今天,我的第一个 Unity 插件 MetaSprite 正式发布了它的 ...

  7. 使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”

    使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean's class, except if it serves...”. 原 ...

  8. python面向对象之静态属性/静态方法/类方法/组合

    继续学习,不要松懈 #!/usr/bin/env python # coding:utf-8 class Campus: def __init__(self,name,addr,type): self ...

  9. elasticsearch 的内存JVM和GC相关问题

    JVM对ElasticSearch集群的稳定性有很大的影响. Java是一个垃圾收集语言,意思是这个程序不会手动管理分配和释放内存.程序员只需要编写代码,jvm管理根据需要管理分配内存的处理,然后在不 ...

  10. QT 定时器详解

    编译器 :   Qt Creator 在窗口化类中实现定时器 .h #include <QTimer> private slots: ... void onTimerOut(); priv ...