内置锁的能力不足以满足需求
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):超时就放弃
内置锁的能力不足以满足需求相关推荐
- 七 内置锁 wait notify notifyall; 显示锁 ReentrantLock
Object中对内置锁进行操作的一些方法: Java内置锁通过synchronized关键字使用,使用其修饰方法或者代码块,就能保证方法或者代码块以同步方式执行. 内置锁使用起来非常方便,不需要显式的 ...
- java 内置锁_深入理解java内置锁(synchronized)和显式锁(ReentrantLock)
synchronized 和 Reentrantlock 多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同 ...
- Java并发编程(1):可重入内置锁
每个Java对象都可以用做一个实现同步的锁,这些锁被称为内置锁或监视器锁.线程在进入同步代码块之前会自动获取锁,并且在退出同步代码块时会自动释放锁.获得内置锁的唯一途径就是进入由这个锁保护的同步代码块 ...
- jvm内置锁synchronized不能被中断
很久没看技术书籍了,今天看了一下<七周七并发模型>前面两章讲的java,写的还是有深度的.看到了一个有demo,说jvm内置锁synchronized是不能被中断的.照着书上写了个demo ...
- Java并发编程实战————可重入内置锁
引言 在<Java Concurrency in Practice>的加锁机制一节中作者提到: Java提供一种内置的锁机制来支持原子性:同步代码块."重入"意味着获取 ...
- Java内置锁——synchronized
一.给对象加把锁 synchronized关键字是Java唯一内置的互斥锁,通过关键字 synchronized 可以保证同一时刻只有一个线程获得某个同步代码块的执行权,但不会导致其他线程执行非同步方 ...
- Android4.2上内置第三方锁屏(一)、锁屏开机加载流程
最近在研究将第三方锁屏内置到android系统的问题,现在有时间来梳理下最近的工作: 首先列举下当前的外部条件: 1.基于CM修改的android4.2,4.4进行内置,这里以android4.4来讲 ...
- 多线程学习笔记一之内置锁
目录 多线程的概念 创建线程 线程状态 synchronized同步锁 volatile 多线程的概念 什么是多线程 操作系统在运行程序时,就会为其创建一个进程,我们可以把进程理解为"运 ...
- Django内置权限扩展案例
当Django的内置权限无法满足需求的时候就自己扩展吧~ 背景介绍 overmind项目使用了Django内置的权限系统,Django内置权限系统基于model层做控制,新的model创建后会默认新建 ...
最新文章
- sql server 2000 数据库。 怎样用sql语句,在没有主键的情况下删除数据库中多条......
- 把王小波作为离我们最近的一个大师
- 51nod1347(简单逻辑)
- Streamlit —使用数据应用程序更好地测试模型
- MATLAB入门学习(三)
- Python协程--生成器(实现多任务)
- 最小生成树 kruskal_使用Kruskal算法求解Java最小生成树问题
- devops 解决方案_DevOps是值得投资的职业倦怠解决方案
- jdk1.8 新特性(中英文)及中文版帮助文档
- 宠物医院app开发的功能有哪些?
- java等额本金、等额本息计算
- XAMPP下安装微博模板
- pcsc linux,Linux 下集成 pcsc ccid libusb
- ToggleButton的学习与使用
- 设计,让交叉口更安全
- 微软输入法的使用技巧
- TB级(小白到大牛之路)技术视频资源福利大放送
- FPGA IP核 串口实验 signaltap
- linux 文件修复工具,Linux环境下几个好用的文件恢复工具
- pta c语言 选择法排序