秋招之路9:juc并发

j.u.c是java.util.concurrent的简称

通过查api,了解到是由以下这三个组成的。

juc包图

锁的两种实现方式

java并发编程,关于锁的实现方式有两种:

1.基于synchronized关键字实现同步,jvm内置锁,也叫隐式锁,由jvm自动加锁和解锁
2.juc下的lock接口实现的更加灵活的锁的实现方式,也叫显示锁,需要手动加锁和解锁

重要分类

locks部分:显示锁(互斥锁和读写锁)相关;
atomic部分:原子变量类相关,是构建非阻塞队列算法的基础,使用CAS实现;
executor部分:线程池相关;
collections部分:并发容器相关;
tools部分:同步工具相关,如信号量,闭锁,栅栏等;

lock图

ReentrantLock锁

ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。
它可以等同于 synchronized的使用,但是 ReentrantLock 提供了比synchronized 更强大、灵活的锁机制,可以减少死锁发生的概率。
其中ReentrantLock里面涉及的公平锁与非公平锁;重入锁和非可重入锁。围绕着去实现的核心内在原理就是AQS抽象队列同步器。
里面ReentrantLock里面的变量

head 队列头
tail 队列尾
state 计数上锁次数
exlusiveOwnerThread 当前占有的线程
  • ReentrantLock 实现 Lock 接口,基于内部的 Sync 实现(Sync是ReentrantLock的一个内部类)。
private final Sync sync;
abstract static class Sync extends AbstractQueuedSynchronizer {};
public ReentrantLock() {
    sync = new NonfairSync();
}
  • Sync 实现 AQS ,提供了 FairSync 和 NonFairSync 两种实现(NonfairSync和FairSync 的两个子类)。
static final class NonfairSync extends Sync {};
static final class FairSync extends Sync {};

condition

Condition 和 Lock 一起使用以实现等待/通知模式,通过 await()和singnal() 来阻塞和唤醒线程。
传送门

//一个条件队列的典型例子
while(!conditionPredition)
    lock.wait();
doSomething();

Condition 是一种广义上的条件队列。
他为线程提供了一种更为灵活的等待 / 通知模式,线程在调用 await 方法后执行挂起操作,直到线程等待的某个条件为真时才会被唤醒。
Condition 必须要配合 Lock 一起使用,因为对共享状态变量的访问发生在多线程环境下。
一个 Condition 的实例必须与一个 Lock 绑定, Condition 一般是 Lock 的内部实现。

ReentrantReadWriteLock

读写锁维护着一对锁,一个读锁和一个写锁
通过分离读锁和写锁,使得并发性比一般的排他锁有了较大的提升:

1.在同一时间,可以允许多个读线程同时访问。
2.但是,在写线程访问时,所有读线程和写线程都会被阻塞。

特性:

  1. 公平性:支持公平性和非公平性。
  2. 重入性:支持重入。读写锁最多支持 65535 个递归写入锁和 65535 个递归读取锁。
  3. 锁降级:遵循获取写锁,再获取读锁,最后释放写锁的次序,如此写锁能够降级成为读锁。
    ReentrantReadWriteLock 实现 ReadWriteLock 接口,可重入的读写锁实现类。
public class ReentrantReadWriteLock
        implements ReadWriteLock, java.io.Serializable {
    /** Inner class providing readlock */
    private final ReentrantReadWriteLock.ReadLock readerLock;
    /** Inner class providing writelock */
    private final ReentrantReadWriteLock.WriteLock writerLock;

在同步状态上,为了表示两把锁,将一个 32 位整型分为高 16 位和低 16 位,分别表示读和写的状态

         /*
         * Read vs write count extraction constants and functions.
         * Lock state is logically divided into two unsigned shorts:
         * The lower one representing the exclusive (writer) lock hold count,
         * and the upper the shared (reader) hold count.
         */

        static final int SHARED_SHIFT   = 16;
        static final int SHARED_UNIT    = (1 << SHARED_SHIFT);
        static final int MAX_COUNT      = (1 << SHARED_SHIFT) - 1;
        static final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;

        /** Returns the number of shared holds represented in count  */
        static int sharedCount(int c)    { return c >>> SHARED_SHIFT; }

原文地址:https://www.cnblogs.com/whyaza/p/12348215.html

时间: 2024-10-27 15:45:50

秋招之路9:juc并发的相关文章

秋招之路2: implements 与 extends ,抽象类总结

extends[继承类]的特点 子类拥有父类的非private属性,方法. 子类可以拥有自己的属性和方法,子类可以对父类进行扩展. 子类可以用自己的方式实现父类的方法. 减少了代码的冗余,即相同重复的代码可以放在父类里面,各自子类有不同的实现. 相关关键字 super:引用父类成员变量.局部变量.方法. this:引用本类成员变量,方法. 需要注意的是:类的成员变量与局部变量重名,类的成员变量将被隐藏,如果要使用类的成员变量,需要使用this引用之. implements[实现接口]的特点 1.

秋招之路1:ArrayList的底层实现原理

ArrayList 概述 ArrayList 是基于数组实现的,是一个动态数组 ArrayList 不是线程安全的,只能在单线程环境下:多线程使用ArrayList,应该考虑Collections.synchronizedList(List l)和concurrent并发包下的CopyOnWriteArrayList类 ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输: 实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速

秋招之路7:全面JVM

jvm全景图 其中蓝色区域是线程独有的,黄色区域是线程共享的 分析方法 javap 命令 javap -c 可以对代码进行反汇编 里面的各种指令,可以用jvm指令手册一个一个查 一个线程的全景图 程序计数器:和计组一样,是存放下一条指令所在单元的地址的地方. 栈帧:一个方法对应一块栈帧内存区域.放自己方法里面各种变量用的. 其中局部变量表一般是放局部变量.操作数栈,一般是放操作过程中的常量. 局部变量表中的对象,存的是对象的地址,对象数据存在堆空间中. 动态链接:将符号引用转换为直接引用. 本地

秋招之路8:JAVA锁体系和AQS抽象队列同步器

整个的体系图 悲观锁,乐观锁 是一个广义概念:体现的是看待线程同步的不同角度. 悲观锁 认为在自己使用数据的时候一定有别的线程来修改数据,在获取数据的时候会先加锁,确保数据不被别的线程修改. 实现:关键字synchronized,接口Lock的实现类 适用场景:写操作多,先加锁可以保证写操作时的数据正确. 乐观锁 认为自己在使用数据的时候不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据. 实现:CAS算法,例如AtomicInteger类的原子自

[转载]从春招到秋招,一个本科生的求职之路。

原文:从春招到秋招,一个本科生的求职之路. 自报家门,北理工软件学院本科生. 主要部分: 1.毕业去向选择 2.春招过程 3.暑期实习 4.秋招辛酸路程 5.一点感悟 1.毕业去向选择问题 从大一开始,就决定毕业找工作,方向是有了,但是三年多过去了,到现在才发现,大学期间并没有为这个方向做出太大的努力,这也成为我一个本科生找工作的很大障碍,实践能力严重不足.我的情况是:我决定工作,但是由于高中的思维,太看重学习成绩,成绩搞的很好,虽然有保研资格,但是又不读研,找工作的时候,好的互联网公司不看成绩

错过了春招的你,难道还不为秋招做准备吗

序 如今的校招,像一场突围赛,很多人"牺牲"在前进的路上,那些突围成功的人,不是因为他们刀枪不入,而是他们有扎实的准备,周密的计划以及可圈可点的技巧. 获得校招的成功,大致需要经历计划.准备.应聘这三个过程,文中全面覆盖这些内容. 无论你是刚刚进入大学的萌新,还是身处在大二.大三的任何阶段,这篇文章都尽可能给出一些建议和指导. 目录 简单的自我介绍 [计划]时间安排:对找工作的同学十分重要的时间点,以及如何安排自己的行程 [准备]技能清单:需要具备的能力 [准备]如何提高:如何有针对性

错过了春招,难道你还不为秋招做准备吗

序 如今的校招,像一场突围赛,很多人"牺牲"在前进的路上,那些突围成功的人,不是因为他们刀枪不入,而是他们有扎实的准备,周密的计划以及可圈可点的技巧. 获得校招的成功,大致需要经历计划.准备.应聘这三个过程,文中全面覆盖这些内容. 无论你是刚刚进入大学的萌新,还是身处在大二.大三的任何阶段,这篇文章都尽可能给出一些建议和指导. 目录 简单的自我介绍 [计划]时间安排:对找工作的同学十分重要的时间点,以及如何安排自己的行程 [准备]技能清单:需要具备的能力 [准备]如何提高:如何有针对性

秋招--线上笔试记录

这系列帖子用来记录的我凉凉的线上笔试,第一次笔试让我更加深刻的认识到了自己的不足,以及还有许多知识点没有看,算法这一块我看来还没入门,只能说秋招道路任重而道远.希望去北京的这条路自己可以能走得再快一点. 下面来记录一下,在这次笔试的我的一些问题 单选 1.最短路径:用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低. 2.通过构建有序序列,对于未排序数据,在已排序序

网易2017秋招编程题集合-牛客网

网易2017秋招编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/0147cbd790724bc9ae0b779aaf7c5b50来源:牛客网 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列. 现在给出一个数字序列,允许使用一