Lock

  • 锁是一种工具,用于控制对共享资源的访问
  • Lock和synchronized,这两个是最常见的锁,它们都可以达到线程安全的目的,但是在使用上和功能上又有较大的不同
  • Lock并不是用来替代synchronized的,而是当使用synchronized不合适或不足以满足要求的时候,来提供高级功能
  • Lock接口中最常见的实现类是ReentrantLock
  • 通常情况下,Lock只允许一个线程来访问这个共享资源,不过有的时候,一些特殊的实现也可允许并发访问,比如ReadWriteLock里面的ReadLock

为什么需要Lock

为什么synchronized不够用

  • 效率低:锁的释放情况少,试图获得锁时不能设定超时,不能中断一个正在试图获得锁的线程
  • 不够灵活(读写锁更灵活):加锁和释放锁的时机单一,每个锁仅有单一的条件(某个对象),可能是不够的
  • 无法知道是否成功获取到锁

Lock的主要方法介绍

  • Lock中声明了4个方法来获取锁
  • lock()、tryLock()、tryLock(long time, TimeUnit unit)和lockInterruptibly()

lock()

  • lock()就是最普通的获取锁,如果锁已被其他线程获取,则进行等待
  • lock()不会像synchronized一样在异常的时候自动释放锁
  • 因此最佳实践是,在finally中释放锁,以保证发生异常时锁一定被释放
  • lock()方法不能被中断,这会带来很大隐患:一旦陷入死锁,lock()就会陷入永久等待
package lock.lock;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 描述:     Lock不会像synchronized一样,异常的时候自动释放锁,所以最佳实践是,finally中释放锁,以便保证发生异常的时候锁一定被释放*/
public class MustUnlock {private static Lock lock = new ReentrantLock();public static void main(String[] args) {lock.lock();try{//获取本锁保护的资源System.out.println(Thread.currentThread().getName()+"开始执行任务");}finally {lock.unlock();}}
}

tryLock()

  • tryLock()用来尝试获取锁,如果当前锁没有被其他线程占用,则获取成功返回true;否则返回false,代表获取锁失败
  • 相比于lock(),这样的方法显然功能更强大了,我们可以根据是否能获取到锁来决定后续程序的行为
  • 该方法会立刻返回,即便在拿不到锁时也不会一直在那等待

tryLock(long time, TimeUnit unit)

  • tryLock(long time, TimeUnit unit):超时就放弃

内置锁的能力不足以满足需求相关推荐

  1. 七 内置锁 wait notify notifyall; 显示锁 ReentrantLock

    Object中对内置锁进行操作的一些方法: Java内置锁通过synchronized关键字使用,使用其修饰方法或者代码块,就能保证方法或者代码块以同步方式执行. 内置锁使用起来非常方便,不需要显式的 ...

  2. java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    synchronized 和 Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同 ...

  3. Java并发编程(1):可重入内置锁

    每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...

  4. jvm内置锁synchronized不能被中断

    很久没看技术书籍了,今天看了一下<七周七并发模型>前面两章讲的java,写的还是有深度的.看到了一个有demo,说jvm内置锁synchronized是不能被中断的.照着书上写了个demo ...

  5. Java并发编程实战————可重入内置锁

    引言 在<Java Concurrency in Practice>的加锁机制一节中作者提到: Java提供一种内置的锁机制来支持原子性:同步代码块."重入"意味着获取 ...

  6. Java内置锁——synchronized

    一.给对象加把锁 synchronized关键字是Java唯一内置的互斥锁,通过关键字 synchronized 可以保证同一时刻只有一个线程获得某个同步代码块的执行权,但不会导致其他线程执行非同步方 ...

  7. Android4.2上内置第三方锁屏(一)、锁屏开机加载流程

    最近在研究将第三方锁屏内置到android系统的问题,现在有时间来梳理下最近的工作: 首先列举下当前的外部条件: 1.基于CM修改的android4.2,4.4进行内置,这里以android4.4来讲 ...

  8. 多线程学习笔记一之内置锁

    目录 多线程的概念 创建线程 线程状态 synchronized同步锁 volatile 多线程的概念 什么是多线程   操作系统在运行程序时,就会为其创建一个进程,我们可以把进程理解为"运 ...

  9. Django内置权限扩展案例

    当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...

最新文章

  1. sql server 2000 数据库。 怎样用sql语句,在没有主键的情况下删除数据库中多条......
  2. 把王小波作为离我们最近的一个大师
  3. 51nod1347(简单逻辑)
  4. Streamlit —使用数据应用程序更好地测试模型
  5. MATLAB入门学习(三)
  6. Python协程--生成器(实现多任务)
  7. 最小生成树 kruskal_使用Kruskal算法求解Java最小生成树问题
  8. devops 解决方案_DevOps是值得投资的职业倦怠解决方案
  9. jdk1.8 新特性(中英文)及中文版帮助文档
  10. 宠物医院app开发的功能有哪些?
  11. java等额本金、等额本息计算
  12. XAMPP下安装微博模板
  13. pcsc linux,Linux 下集成 pcsc ccid libusb
  14. ToggleButton的学习与使用
  15. 设计,让交叉口更安全
  16. 微软输入法的使用技巧
  17. TB级(小白到大牛之路)技术视频资源福利大放送
  18. FPGA IP核 串口实验 signaltap
  19. linux 文件修复工具,Linux环境下几个好用的文件恢复工具
  20. pta c语言 选择法排序

热门文章

  1. HTMLCSS 第三天 笔记
  2. Nginx的location区块的作用及设置
  3. js中this关键字的使用
  4. 10.3 广州集训 Day2
  5. 智能安防新时代:用户、SI、设备制造商要做什么?
  6. GitHub上创建组织
  7. 1 第一次画PCB总结
  8. 一个 bug / Masonry的引入
  9. 解决ntfs格式的移动硬盘mount到Linux下时变成只读文件系统的问题
  10. 给你的主机防火墙添加l7-filter