Lock 是 Java API 提供的另一种线程同步机制,它提供了比 synchronized 关键字更为灵活、强大的锁定操作。

锁是控制多个线程对共享资源进行访问的工具。通常,锁提供了对共享资源的独占访问,一次只允许一个线程获得锁,对共享资源的所有访问都需要先获得锁。不过,某些锁可能允许对共享资源并发访问,如 ReadWriteLock 的读锁。

synchronized 方法或语句的使用提供了对与每个对象相关的隐式监视器锁的访问,但却强制所有锁获取和释放均要出现在一个块结构中:当获取了多个锁时,它们必须以相反的顺序释放,且必须在与所有锁被获取时相同的词法范围内释放所有锁。

虽然 synchronized 方法和语句的范围机制使得使用监视器锁编程方便了很多,而且还帮助避免了很多涉及到锁的常见编程错误,但有时也需要以更为灵活的方式使用锁。例如,某些遍历并发访问的数据结果的算法要求使用 "hand-over-hand" 或 "chain locking":获取节点 A 的锁,然后再获取节点 B 的锁,然后释放 A 并获取 C,然后释放 B 并获取 D,依此类推。Lock 接口的实现允许锁在不同的作用范围内获取和释放,并允许以任何顺序获取和释放多个锁,从而支持使用这种技术。

随着灵活性的增加,也带来了更多的责任。不使用块结构锁就失去了使用 synchronized 方法和语句时会出现的锁自动释放功能。在大多数情况下,应该使用以下语句:

Lock l =...;

l.lock();try{//access the resource protected by this lock

} finally{

l.unlock();

}

锁定和取消锁定出现在不同作用范围中时,必须谨慎地确保保持锁定时所执行的所有代码用 try-finally 或 try-catch 加以保护,以确保在必要时释放锁。

Lock 提供了使用 synchronized 方法和语句所没有的其他功能,包括提供了一个非块结构的获取锁尝试 (tryLock())、一个获取可中断锁的尝试 (lockInterruptibly()) 和一个获取超时失效锁的尝试 (tryLock(long, TimeUnit))。

tryLock()

仅在调用时锁为空闲状态才获取该锁。如果锁可用,则获取锁,并立即返回值 true。如果锁不可用,则此方法将立即返回值 false。

此方法的典型使用语句如下:

Lock lock =...;if(lock.tryLock()) {try{//manipulate protected state

} finally{

lock.unlock();

}

}else{//perform alternative actions

}

此用法可确保如果获取了锁,则会释放锁,如果未获取锁,则不会试图将其释放。

tryLock(long, TimeUnit)

如果锁在给定的等待时间内空闲,并且当前线程未被中断,则获取锁。

如果锁可用,则此方法将立即返回值 true。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下三种情况之一前,该线程将一直处于休眠状态:

锁由当前线程获得;或者

其他某个线程中断当前线程,并且支持对锁获取的中断;或者

已超过指定的等待时间

如果获得了锁,则返回值 true。

如果当前线程:

在进入此方法时已经设置了该线程的中断状态;或者

在获取锁时被中断,并且支持对锁获取的中断,

则将抛出 InterruptedException,并会清除当前线程的已中断状态。

如果超过了指定的等待时间,则将返回值 false。如果 time 小于等于 0,该方法将完全不等待。

lockInterruptibly()

如果当前线程未被中断,则获取锁。

如果锁可用,则获取锁,并立即返回。如果锁不可用,出于线程调度目的,将禁用当前线程,并且在发生以下两种情况之一以前,该线程将一直处于休眠状态:

锁由当前线程获得;或者

其他某个线程中断当前线程,并且支持对锁获取的中断。

如果当前线程:

在进入此方法时已经设置了该线程的中断状态;或者

在获取锁时被中断,并且支持对锁获取的中断,

则将抛出 InterruptedException,并清除当前线程的已中断状态。

java concurrency_Java Concurrency - Lock相关推荐

  1. java.sql.SQLException: Lock wait timeout exceeded

    2019独角兽企业重金招聘Python工程师标准>>> 先说我我的解决方法:找到锁住的线程然后kill掉. mysql> kill thr_id; 下面简单分析一下到底应该ki ...

  2. java.sql.SQLException: Lock wait timeout exceeded --转

    org.springframework.dao.CannotAcquireLockException 的解决> 直接上 bug 的详细信息: 2012-03-12 15:20:31 XmlBea ...

  3. RocketMQ集群启动报错:java.lang.RuntimeException: Lock failed,MQ already started

    启动RocketMQ集群后报错: java.lang.RuntimeException: Lock failed,MQ already startedat org.apache.rocketmq.st ...

  4. Java线程安全Lock、ReentrantLock、ReentrantReadWriteLock

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120750932 本文出自[赵彦军的博客] Java线程安全StampedLock ...

  5. 深入研究 Java Synchronize 和 Lock 的区别与用法

    在分布式开发中,锁是线程控制的重要途径.Java为此也提供了2种锁机制,synchronized和lock.做为Java爱好者,自然少不了对比一下这2种机制,也能从中学到些分布式开发需要注意的地方. ...

  6. java volatile lock_Java并发学习笔记 -- Java中的Lock、volatile、同步关键字

    Java并发 一.锁 1. 偏向锁 1. 思想背景 来源:HotSpot的作者经过研究发现,大多数情况下,锁不仅不存在多线程竞争,而且总是由同 一线程多次获得,为了让线程获得锁的代价更低而引入了偏向锁 ...

  7. 深圳Java培训:Lock线程锁

    深圳Java培训:Lock线程锁 1:synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中 ...

  8. JAVA多线程-基础Lock Condition 并发集合

    代码的逻辑: 1)SProducer不停的产生number到queue中. 2)3个carrier不停的取出queue中的number. 3)如果queue中存在10个剩余number时,SProdu ...

  9. Java synchronized 与 lock (Reetrantlock)锁性能比较

    使用synchronzied和ReetrantLock做一百万次自增运算性能比较,比较一个线程和多线程情况下 package com.lock.test; public class LockValue ...

最新文章

  1. [转]优化Flash性能
  2. html 图片剪裁控件,h5图像裁剪(基于canvas)插件Image-Clip
  3. 用Jenkins自动化构建Android和iOS应用
  4. python xlsxwriter 在 flask 中的使用
  5. Kaggle Titanic补充篇
  6. LeetCode 657. Judge Route Circle
  7. python groupby用法_Python 标准库实践之合并字典组成的列表
  8. 静态代码块无法对静态变量赋值的原因
  9. Realsense安装使用过程问题汇总
  10. java筛选excel数据_Excel中的筛选技巧有哪些,总结四种筛选技巧分享给大家
  11. [译]直观理解信息论
  12. openpcdet KeyError: ‘road_plane‘
  13. 单片机程序配置成开漏输出_单片机的GPIO配置
  14. curl encode
  15. 基于Python的豆果网食谱数据爬取及可视化分析系统
  16. 要有遥不可及的梦想,也要有脚踏实地的本事
  17. 无代码生产新模式探索
  18. 读薄《高性能MySql》(三)索引优化
  19. Zeppelin安装教程
  20. 计算机网络——Wireshark软件使用与协议分析(ARP协议、IP与ICMP分析)

热门文章

  1. assignment mismatch: 1 variable but uuid.NewV4 returns 2 values
  2. python3 实现 websocket server 解决中文乱码
  3. c#(winform)环境下使用动态链接库dll的详解
  4. 运动检测(前景检测)之——ViBe
  5. swing GeneralPath::cubicTo绘制平滑曲线
  6. Cissp-【第4章 通信与网络安全】-2021-3-14(476页-542页)
  7. 需要氪金吗_《天堂2:血盟》到底需不需要氪金?玩家:可以但是没有必要
  8. python判断路径是文件还是文件夹_python之判断是否是目录或文件
  9. asp.net接受表单验证格式后再提交数据_创建一个注册界面,并记录到数据库中...
  10. 推荐一款IDE开发工具插件GitToolBox