锁处理机制简介

juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题。

为了解决这样的缺陷,juc里面重新针对于锁的概念进行了设计。

JUC锁机制

JUC锁机制包括以下几个组成部分:

  • 核心接口:LockReadWriteLock
  • AQS抽象类:
    • AbstractOwnableSynchronizer (排它锁);
    • AbstractQueuedSynchronizer (为实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关同步器(信号量、事件,等等)提供一个框架);
    • AbstractQueuedLongSynchronizer (64位同步器)
  • 工具类:
    • Reentrantock互斥锁、ReadWriteLock读写锁、Condition控制队列
    • LockSupport阻塞原语、Semaphore信号量、CountDownLatch闭锁
    • CyclicBarrier栅栏、Exchanger交换机、CompletableFuture线程回调

之所以在juc里面要重新提供一系列的锁的处理工具类,其根本原因在于,Java原始的锁机制(synchronized)虽然可以提供有数据的安全访问机制,但是其缺点也是非常明显的:所有的线程对象只能享受一把锁

java.util.concurrent锁概览

  • java.util.concurrent.locks提供了锁的基础支持;
  • Lock接口:支持语义不同(重入、公平等)的锁规则
    • 语义不同,是指锁可是有 “公平机制的锁”、“非公平机制的锁”、“可重入的锁”等等;

      • 公平机制:指不同线程获取锁的机制是公平的;
      • 非公平机制:指不同线程获取锁的机制是非公平的;
      • 可重入的锁:指同一个锁能够被一个线程多次获取,可重入锁最大的作用是避免死锁。
  • ReadWriteLock接口和Lock类似的方式定义了一些读取者可以共享而写入独占的锁;
  • Condition接口描述了可能会与锁有关的条件变量(与Objec类的wait()方法使用类似)。

公平锁核心概念

  • AbstractQueuedSynchronizer:是Java管理 “锁”的抽象类,锁的许多公共方法都是都是在这个类中实现。AbstractQueuedSynchronizer是独占锁(例如,ReentrantLock)。
  • AbstractQueuedSynchronizer类别:
    • 独占锁:锁在同一个时间点只能被一个线程锁占有。根据锁的获取机制,它有划分为“公平锁”和“非公平锁”。公平锁是按照通过CLH等待线程按照先来先得的规则公平的获取锁;而非公平锁则当线程获取锁时,它会无视CLH等待队列而直接回去锁。
    • 共享锁:能被多个线程同时拥有,能被共享的锁。
  • CLH队列(Craig,Landin,and Hagersten locks):CLH锁也是一种基于链表的可扩展、高性能、公平的自旋锁,申请线程只在本地变量上自旋,它不断轮询前驱的状态,如果发现前驱释放了锁就结束自旋。
  • CAS方法(Compare And Swap):比较并交换方法,它是原子操作方法:即,通过CAS操作的数据都是以原子方式进行的。

CLH锁——解决死锁问题

JUC——线程同步锁(锁处理机制简介)的更多相关文章

  1. Java提高班(三)并发中的线程同步与锁

    乐观锁.悲观锁.公平锁.自旋锁.偏向锁.轻量级锁.重量级锁.锁膨胀...难理解?不存的!来,话不多说,带你飙车. 上一篇介绍了线程池的使用,在享受线程池带给我们的性能优势之外,似乎也带来了另一个问题: ...

  2. Java并发包——线程同步和锁

    Java并发包——线程同步和锁 摘要:本文主要学习了Java并发包里有关线程同步的类和锁的一些相关概念. 部分内容来自以下博客: https://www.cnblogs.com/dolphin0520 ...

  3. python笔记10-多线程之线程同步(锁lock)

    前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸 ...

  4. Java多线程02(线程安全、线程同步、等待唤醒机制)

    Java多线程2(线程安全.线程同步.等待唤醒机制.单例设计模式) 1.线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码.程序每次运行结果和单线程运行的结果是一样的,而且其他的变量 ...

  5. JUC——线程同步锁(ReentrantReadWriteLock读写锁)

    读写锁简介 所谓的读写锁值得是两把锁,在进行数据写入的时候有一个把“写锁”,而在进行数据读取的时候有一把“读锁”. 写锁会实现线程安全同步处理操作,而读锁可以被多个对象读取获取. 读写锁:ReadWr ...

  6. JUC——线程同步锁(ReentrantLock)

    ReentrantLock简介 ReentrantLock是一个可重复的互斥锁,又被称为独占锁,可重入的意思是:ReentrantLock锁可以被单个线程多次获取.但是在同一个时间点只能被一个线程锁持 ...

  7. JUC——线程同步锁(LockSupport阻塞原语)

    java.util.concurrent.locks.LockSupport这个是一个独立的类,这个类的主要功能是用来解决Thread里面提供的suspend()(挂起线程).resume()(恢复运 ...

  8. iOS开发线程同步技术-锁

    概览 1,什么是锁(临界区)? 2,常用的锁有哪些? 3,相关链接 什么是锁(临界区) 临界区:指的是一块对公共资源进行访问的代码,并非一种机制或是算法. 常用的锁有哪些? 互斥锁:是一种用于多线程编 ...

  9. 线程同步——lock锁

    线程同步即解决线程安全问题的第三种方式——使用lock锁 代码实现: 其中,ReentrantLock是lock接口的实现类,这边是使用多态创建,访问成员方法时,编译看左,运行看右: Reentran ...

随机推荐

  1. LeetCode刷题(数据库)---- 交换工资

    题:给定一个工资表,如下所示,m=男性 和 f=女性 .交换所有的 f 和 m 值(例如,将所有 f 值更改为 m,反之亦然).要求使用一个更新查询,并且没有中间临时表. 例如: | id | nam ...

  2. yii2数据库简单操作

    1.简单查询: one(): 根据查询结果返回查询的第一条记录. all(): 根据查询结果返回所有记录. count(): 返回记录的数量. sum(): 返回指定列的总数. average():  ...

  3. PL/SQL Developer修改窗口字体和大小

    工具 → 首选项 → 字体 → 选择, 然后自己调节设置

  4. 指纹协查统计sql

     select dic.name, NVL(zc.zc_djzs,0),NVL(zc.zc_shzs,0),NVL(zc.zc_bzzs,0), NVL(zt.zt_djzs,0),NVL(zt.zt ...

  5. Linux Shell常用技巧(十一)

    二十二. 交互式使用Bash Shell:     1.  用set命令设置bash的选项:    下面为set主要选项的列表及其表述: 选项名 开关缩写 描述 allexport -a 打开此开关, ...

  6. H5页面手机端禁止缩放的正确方式

    H5页面禁止手机端缩放是个常见问题了 首先说meta方式 <meta content="width=device-width, initial-scale=1.0, maximum-s ...

  7. throws、throw和try catch

    在学习代理模式的时候,编写动态生成代理类.java文件时,用try{}catch(){}捕获异常发现catch(Exception e)报错,得换成catch(Throwable e),然后又查了查两 ...

  8. STM32 HAL库学习系列第3篇 常使用的几种延时方式

    1   自带的hal_delay 函数    毫秒级延迟 void HAL_Delay(__IO uint32_t Delay) { uint32_t tickstart = HAL_GetTick( ...

  9. 目标反射回波检测算法及其FPGA实现 之一:算法概述

    目标反射回波检测算法及其FPGA实现之一:算法概述 前段时间,接触了一个声呐目标反射回波检测的项目.声呐接收机要实现的核心功能是在含有大量噪声的反射回波中,识别出发射机发出的激励信号的回波.我会分几篇 ...

  10. kubernetes基本概念和术语

    一. kubernetes是什么 kubernetes是一个全新得基于容器技术得分布式架构领先方案.是google Borg得一个开源版本.Borg是google得一个久负盛名得内部使用得大规模集群管 ...