显式锁

一、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. 使用Emit实现给实体赋值

    Dapper.net的速度很快,最近看源码,原来他orm的实现是通过编写大量IL代码实现的. 使用DynamicMethod,自己编织一个给实体赋值的方法.这种写法效率很高,接近直接对属性赋值.比使用 ...

  2. 用 go 写 WebAssembly入门

    Golang WebAssembly 入门 Golang 在1.11版本中引入了 WebAssembly 支持,意味着以后可以用 go编写可以在浏览器中运行的程序,当然这个肯定也是要受浏览器沙盒环境约 ...

  3. Python 日常学习

    习惯了java的思想.用java的思想来获取python元组中的数据.结果出错了. yuanzu_s = ("one", "two", "three& ...

  4. console使用技巧

    http://heikezhi.com/yuanyi/10%E4%B8%AAchrome%20console%E5%AE%9E%E7%94%A8%E5%B0%8F%E6%8A%80%E5%B7%A7 ...

  5. openstack kolla 部署---不同的节点采用不同的物理接口

    在 /etc/kolla/globals.yml 文件中删除 neutron_external_interface  tunnel_interface  api_interface  storage_ ...

  6. DP刷题

    http://blog.csdn.net/a1dark/article/details/17115137

  7. 学习笔记|Java 教程|菜鸟教程

    一.Java 教程 1.Java 教程 Java 在线工具 JDK 1.6 在线中文手册 我的第一个 JAVA 程序 创建文件 HelloWorld.java(文件名需与类名一致), 代码如下: pu ...

  8. java的堆,栈,静态代码区 详解

    面试中,有家公司做数据库开发的,对内存要求比较高,考到了这个 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方— ...

  9. Linux 线程调度策略与线程优先级

    Linux内核的三种调度策略 SCHED_OTHER 分时调度策略. 它是默认的线程分时调度策略,所有的线程的优先级别都是0,线程的调度是通过分时来完成的.简单地说,如果系统使用这种调度策略,程序将无 ...

  10. [原创] Trie树 php 实现敏感词过滤

    目录 背景 简介 存储结构 PHP 其他语言 字符串分割 示例代码 php 优化 缓存字典树 常驻服务 参考文章 背景 项目中需要过滤用户发送的聊天文本, 由于敏感词有将近2W条, 如果用 str_r ...