显式锁

一、Lock与ReentrantLock

  Lock提供了一种无条件的、可轮询的、定时的以及可中断的锁获取操作,所有的加锁和解锁方法都是显式的

  ReentrantLock实现了Lock:并提供了和synchronized相同的内存语义;同时提供了可重入的加锁语义

  1.基本语义:

void LockDefinition() {
Lock lock = new ReentrantLock();
try {
//do someting
//更新对象状态,捕获异常;并在必要时恢复不变性条件
} finally {
//finally中释放锁
lock.unlock();
}
}

  2.轮询锁与定时锁

    lock.tryLock([Long,TimeUnit]):尝试获取锁,带上时间就是定时锁

  3.可中断的锁获取操作

    lock.lockInterruptibly();

二、公平性

  ReentrantLock可以创造公平锁(已请求顺序获取锁)和非公平锁(可插队)。

    插队:当一个线程请求非公平锁,如果在发出请求的同时该锁的状态可用,那么这个线程不会放入队列,会跳过队列中所有的等待线程并获得锁;

    注意:非公平锁并不提倡插队,但无法防止插队;而公平锁则是会放入队列中顺序执行

    非公平锁在竞争激烈时速度比公平锁快:原因是在恢复一个在队列中的线程与该线程开始运行之间存在严重的延迟

三、读-写锁

  ReentrantLock是标准的互斥锁,但是在某些场景如:读读可并行无法实现

  ReadWriteLock读写锁:实现ReentrantReadWriteLock:方法readLock读锁和writeLock写锁

  1、交互和实现方式

    释放优先:当一个写锁被释放,而队列中同时存在读和写,那么应该优先选择读,写,还是最先发出请求的线程?

    读线程插队:当前读锁,有写锁在等待,那么后面来的读锁要不要插队直接读?如果直接读会提高并发但是会可能造成写饥饿获取不到

    重入性:读锁和写锁是否可重入?

    降级:写锁,能否在不释放锁情况下获取读锁,使该线程的锁降级?

    升级:读锁能否优先于其他等待线程升级为写锁?如果两个线程试图同时升级为写锁,那么容易造成死锁

  适用于:读取操作为主的数据结构

java并发编程(6)显式锁的更多相关文章

  1. Java并发编程之显式锁机制

    我们之前介绍过synchronized关键字实现程序的原子性操作,它的内部也是一种加锁和解锁机制,是一种声明式的编程方式,我们只需要对方法或者代码块进行声明,Java内部帮我们在调用方法之前和结束时加 ...

  2. 并发编程 19—— 显式的Conditon 对象

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  3. Java并发编程实战 03互斥锁 解决原子性问题

    文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和 ...

  4. java之AQS和显式锁

    本次内容主要介绍AQS.AQS的设计及使用.ReentrantLock.ReentrantReadWriteLock以及手写一个可重入独占锁 1.什么是AQS? AQS,队列同步器AbstractQu ...

  5. Java并发编程(五)锁的使用(下)

    显式锁 上篇讲了使用synchronized关键字来定义锁,其实Java除了使用这个关键字外还可以使用Lock接口及其实现的子类来定义锁,ReentrantLock类是Lock接口的一个实现,Reen ...

  6. Java并发编程:线程和锁的使用与解析

    线程的使用  新建线程 新建一个线程有两种方法:继承Thread类,然后重写run方法:实现Runnable接口,然后实现run方法.实际上Thread类也是实现的Runnable接口,再加上类只能单 ...

  7. Java并发编程(05):悲观锁和乐观锁机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并 ...

  8. Java并发编程-可重入锁

    可重入锁,也叫做递归锁,指的是同一线程 外层函数获得锁之后 ,内层递归函数仍可以获取该锁而不受影响.在JAVA环境下 ReentrantLock 和synchronized 都是 可重入锁. publ ...

  9. Java并发编程:synchronized和锁优化

    1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...

  10. Java并发编程:Lock(锁)

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被syn ...

随机推荐

  1. DNS本机可解析,其他主机通过本机无法解析问题

    新建了一个redhat虚拟机,将此虚拟机作为dns服务器使用,配置完以后宿主机的dns服务器设置为配置好的虚拟机地址,结果总是显示no Server Reached,没有服务器可以到达,花了很长时间终 ...

  2. SQL 从数据库中随机取n条数据

    用NEWID()方法. * ,NEWID() AS random from [toblename] order by random 其中的1可以换成其他任意整数,表示取的数据条数

  3. ASP.NET IIS 支持PUT、DELETE请求

    IIS 本身不支持PUT.DELETE请求,但可以通过一下方法修改进而达到目的 删除IIS安装的WebDav模块,选择你的项目,右边有个“模块”,双击它:找到WebDavModule,删除它(不推荐, ...

  4. Asp.NetCore取配置信息

    本文简单介绍Asp.NetCore取自定义配置信息的方法,要取配置信息首先得有配置文件. 1, 本例新建了一个TimeOut.json配置文件,和其对应的一个TimeOut类 2, 首先在Startu ...

  5. [文文殿下]基本的DP技巧

    . 二进制状态压缩动态规划 对于某些情况,如果题目中所给的限制数目比较小,我们可以尝试状态压缩动态规划.例如,题目中给出数据范围\(n<=20\),这个一般情况下是一个状压DP的提示. 状态压缩 ...

  6. 两个for循环效率,哪个高

    在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数.

  7. Linux下安装pip(遇到了python2.6升级为python2.7道路上的坑,原因已经找到,只差临门一脚了,以后补上)

    1.先说一下什么是pippip 是“A tool for installing and managing Python packages.”,也就是说pip是python的软件安装工具2.下面介绍怎么 ...

  8. PDF转HTML的方法。

    上个项目客户提出了一个需求,要求把PDF格式的文件转化为HTML格式. 上网查了一下,要么使用软件处理,要么是HTML格式转化为PDF.因为涉及到图文识别问题,所以说仅仅依靠前端不能实现.在网上查了几 ...

  9. 2016级算法期末上机-B.简单·ModricWang's Fight with DDLs I

    1124 ModricWang's Fight with DDLs I 思路 这道题本质上就是一个多项式求值,题目中的n需要手动算一下,单位复根可以根据复数的性质来求,即\(e^{i\pi}+1=0\ ...

  10. spring属性配置执行过程,单列和原型区别

    Spring配置中,采用属性注入时,当创建IOC容器时,也直接创建对象,并且执行相对应的setter方法 Student.java package com.scope; public class St ...