Lock的基本属性

*  1)Lock是手动锁,加锁和释放必须得手动进行
*  2)使用ReentrantLoock,尝试锁定,“tryLock”,这样无法锁定,或者在指定时间内无法锁定,
*    线程可以决定是否等待
*  3)使用ReenTrantLock还可以调用lockInterruptibly方法,可以对线程的interrupt做成响应
*     在一个线程等待的过程中,可以被打断
*  4)ReentrantLock还可以指定为公平锁(让等待时间最长的得到锁) Lock lock=new ReentrantLock(true)
*  5)Condition producer=lock.newCondition();
*     Condition的方式可以更加精确的指定哪些线程被唤醒
*

首先介绍tryLock的基本使用

public class testLock {Lock lock=new ReentrantLock();void m1(){try {lock.lock();for(int i=0;i<10;i++){TimeUnit.SECONDS.sleep(1);System.out.println(i);}}catch (InterruptedException e){e.printStackTrace();}finally {{lock.unlock();}}}/*使用trylock进行锁定,不管锁定与否,方法都将继续执行也可以执行tryLock的时间,由于tryLock(time)抛出异常,所以注意unLock的处理,必须放到finally中*/void m2(){/*boolean locked=lock.tryLock();System.out.println("m2...."+locked);if(locked) lock.unlock();*/boolean locked=false;try{locked=lock.tryLock(5,TimeUnit.SECONDS);System.out.println("m2.."+locked);}catch (InterruptedException e){e.printStackTrace();}finally {if (locked)lock.unlock();}}public static void main(String[] args) {testLock r1=new testLock();new Thread(r1::m1).start();try{TimeUnit.SECONDS.sleep(1);}catch (InterruptedException e){e.printStackTrace();}new Thread(r1::m2).start();}
}

关于响应中断的举例

public class testLock1 {public static void main(String[] args) {Lock lock=new ReentrantLock();Thread t1=new Thread(()->{try{lock.lock();System.out.println("t1 start");TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);System.out.println("t1 end");}catch (InterruptedException e){System.out.println("Interrupte 1");}finally {lock.unlock();}});t1.start();//try{TimeUnit.SECONDS.sleep(5);}catch (InterruptedException e){e.printStackTrace();}Thread t2=new Thread(()->{try{lock.lockInterruptibly();//可以对interrupt()做出响应System.out.println("t2 start");TimeUnit.SECONDS.sleep(5);System.out.println("t2 end");}catch (InterruptedException e){System.out.println("Interrupte 2");}finally {if (!((ReentrantLock) lock).isLocked())lock.unlock();}});t2.start();try{TimeUnit.SECONDS.sleep(5);}catch (InterruptedException e){e.printStackTrace();}t2.interrupt();//打断线程2的等待}
}

关于Condition 的使用,可以使用以下这篇关于手写固定同步容器的博客,很有借鉴性
https://www.cnblogs.com/jpfss/p/9913344.html

高并发锁Lock的详细使用相关推荐

  1. php高并发锁,redis锁,文件锁示例

    <?php //redis锁 class RedisLock{//redis对象private $redis;//idprivate $id;public function __construc ...

  2. 从nginx“惊群”问题来看高并发锁的方案

    从nginx"惊群"问题来看高并发锁的方案 1. 惊群的现象与原因 2. 互斥锁/自旋锁 3. 原子操作CAS的实现 视频讲解如下,点击观看: 从nginx"惊群&quo ...

  3. 《实战Java高并发程序设计》读后感

    写在前面无关的内容 白驹过隙,看下日历已经毕业4年多,加上在大学里的4年,算算在计算机界也躺了八年,按照格拉德韦尔的1万小时定律差不多我也该成为行业的专家了,然后并没有.当看着"什么是Jav ...

  4. 每一个程序员都应该知道的高并发处理技巧、创业公司如何解决高并发问题、互联网高并发问题解决思路、caoz大神多年经验总结分享...

    本文来源于caoz梦呓公众号高并发专辑,以图形化.松耦合的方式,对互联网高并发问题做了详细解读与分析,"技术在短期内被高估,而在长期中又被低估",而不同的场景和人员成本又导致了巨头 ...

  5. 推测的删除锁(Speculative Lock Elision):实现高并发多线程执行

    背景 SLE全称Speculative Lock Elision,我称之为推测的删除锁.这是一篇关于SLE的论文翻译,但是因为本人英语功底很差,所以翻译的不通顺而且会有很多错误的地方.之所以把它发出来 ...

  6. 分布式锁和mysql事物扣库存_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

  7. oracle 锁表如何解决_Java高并发解决什么方式

    对于我们开发的网站,如果网站的访问量非常大的话,那么我们就需要考虑相关的并发访问问题了.而并发问题是绝大部分的程序员头疼的问题,但话又说回来了,既然逃避不掉,那我们就坦然面对吧~今天就让我们一起来研究 ...

  8. 高并发线程/锁/内存处理模型

    文章目录 锁与线程 一.进程/线程的基本介绍 进程 线程 1 线程的调度与时间片 2 优先级 3 生命周期 进程与线程的区别 二.线程的使用 2.1 Thread类的介绍 2.2 创建线程的方法 Th ...

  9. java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

最新文章

  1. Datawhale实验室
  2. 酷!一键构建我自己的PHP框架的开发环境
  3. 如果面试官问你 JVM,额外回答逃逸分析技术会让你加分!
  4. MySQL中字段字符集不同导致索引不能命中
  5. 第三方类AFNetworking
  6. websocket探究
  7. linux查看和修改PATH环境变量的方法
  8. CentOS7 常用命令集合
  9. 最快15分钟,完成高精度AI模型定制开发
  10. 事务对性能影响_不是事务的事务!(分布式事务系列-完结篇)
  11. git 日常 常用命令
  12. c++第五版练习10.14 10.15
  13. Oracle PLSQL 从入门到精通
  14. 【板栗糖GIS】twinmotion—twinmotion如何联动sketchup
  15. 高通8926和高通410的参数对比
  16. Stephen R.Covey《高效人士的7个习惯》
  17. 【前端小技能】ElementUI表格双击可编辑--开箱即用
  18. win10重置计算机网络设置,为你解答win10下如何重置网络
  19. Excel表格中如何换行
  20. IntelliJ IDEA 12.0搭建Maven Web SSH2架构项目示例(二)

热门文章

  1. [置顶] 火车票余票接口API使用方法
  2. 更新MYSQL生成日历表,支持跨年份 存储过程
  3. 使用Maven 创建web3.0项目
  4. python使用pip安装_Python | 如何用pip安装模块和包
  5. com.rabbitmq.client.AuthenticationFailureException: ACCESS_REFUSED
  6. python--采集1(urllib模块)
  7. /dev/sda2占用100%、磁盘占用100%的怎么解决?
  8. excel操作练习_你见过最好的Excel教程有哪些?
  9. 软件工程师你应该知道的100个原则
  10. Windows系统中常见的进程DOS操作命令