锁处理机制简介

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. POJ 3080 Blue Jeans 找最长公共子串(暴力模拟+KMP匹配)

    Blue Jeans Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 20966   Accepted: 9279 Descr ...

  2. QT 简单 TCP 通信,发送数据到服务器

    1.首先 添加头文件 #include <QtNetwork/QTcpSocket> 并且 在 xxx.pro(xxx指工程的名称) 中QT += core gui下面,添加 下面两句句话 ...

  3. Cache Buffer 区别

    Cache 一般位于CPU中, 分为 L1 Cache, L2 Cache, 是一种读的操作,把CPU刚用过的/循环使用的数据存储起来,当CPU再次使用时,可以直接从Cache存储器中调用,减少了等待 ...

  4. Oracle与MySQL使用区别

    与MySQL通过创建不同的数据库来存储表 Oracle提出表空间(tablespace)的概念作为逻辑上的存储区域来存储表, 而不同的表空间由不同的用户来管理 用户可以授予权限或角色 举例: 使用PL ...

  5. [JLOI2014]松鼠的新家(线段树,树链剖分)

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...

  6. JQuery中ajaxSubmit,在ie或360兼容,提交后台不能获得参数

    问题描述:360兼容模式.IE浏览器,通过ajaxSubmit提交,后台不能获得参数值 解决办法:把options.semantic这个参数改成true 代码: var ajax_option={ s ...

  7. ps基本认识

    近来中意ui方面学习,从视频中总结了些许notses,希望能够帮到共同喜欢(❤ ω ❤)的友友 ·基础了解 位图:由像素组成的图片,把位图无限放大以后看到很多小方格,一个方格代表一个像素 矢量图:放大 ...

  8. Hive中导入Amazon S3中的分区表数据的操作

    Hive中创建S3的外部表 数据在S3存放的数据是按时间纬度存放的,每天的数据存放在各自的目录下,目录结构如下截图: 每个目录下面的数据是CSV文件,现在将其导入到Hive中进行查询,通过创建对应的表 ...

  9. 手搓一个兔子问题(分享一个C语言问题,持续更新...)

    大家好,我是小七夜,今天就不分享C语言的基础知识了,分享一个比较好玩的C语言经典例题:兔子问题 题目是这样的:说有一个穷苦人这天捉到了一只公兔子,为了能繁衍后代他又买了一只母兔子,后来兔子开始生小兔子 ...

  10. C语言程序设计:现代方法(第2版)第三章全部习题答案

    前言 本人在通过<C语言程序设计:现代方法(第2版)>自学C语言时,发现国内并没有该书完整的课后习题答案,所以就想把自己在学习过程中所做出的答案分享出来,以供大家参考.这些答案是本人自己解 ...