04 2023 档案

摘要:1 前言 这节我们来看看计算机中的常见的栈结构。 2 栈定义 栈是一个后进先出(Last In Fist Out, LIFO)的线性表,它要求只在表尾进行删除和插入操作。 所谓的栈,其实就是一个特殊的线性表(顺序表、链表),但是它在操作上有一些特殊的要求和限制: 栈的元素必须“后进先出” 栈的操作只 阅读全文
posted @ 2023-04-30 23:30 酷酷- 阅读(422) 评论(0) 推荐(0) 编辑
摘要:1 前言 只要大家坐过火车,对于双向链表的理解就相当简单。双向链表就是在单链表的基础之上,为每一个结点增加了它的前继结点,我们来看看。 2 双向链表 双向链表的定义如下: typedef struct DaulNode { ElemType data; struct DaulNode *prior; 阅读全文
posted @ 2023-04-30 21:13 酷酷- 阅读(109) 评论(0) 推荐(0) 编辑
摘要:1 前言 对于单链表,由于每个结点只存储了向后的指针,到了尾部标识就停止了向后链的操作。也就是说,按照这样的方式,只能索引后继结点不能索引前驱结点。这样一来,不从头结点出发,这样就无法访问到全部结点。 为了解决这个问题,我们只需要将单链表的尾结点的指针由空指针改为指向头结点的指针。 2 循环链表 将 阅读全文
posted @ 2023-04-30 20:59 酷酷- 阅读(102) 评论(0) 推荐(0) 编辑
摘要:1 前言 地球人都知道C语言是个伟大的语言,它的魅力在于指针的灵活性,使得它可以非常容易地操作内存中的地址和数据,这比其他高级语言更加灵活方便。(面向对象语言,比如java,可以使用对象引用机制间接地实现指针的某些功能) 但是古人还是木有C语言丫,木有JAVA丫,只有原始的Basic,Fortran 阅读全文
posted @ 2023-04-30 19:02 酷酷- 阅读(144) 评论(0) 推荐(0) 编辑
摘要:1 前言 线性表的链式存储结构的特点就是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以在内存中未被占用的任意位置。 比起顺序存储结构每个元素只需要存储一个位置就可以了。现在链式存储结构中,除了要存储数据信息外,还要存储它的后继元素的存储地址(指针)。 也就是说除了存储其本身的信息外,还需 阅读全文
posted @ 2023-04-30 18:29 酷酷- 阅读(462) 评论(0) 推荐(0) 编辑
摘要:1 什么是线性表 线性表的定义:由零个或多个数据元素组成的有限序列 首先它是一个序列,也就是说元素之间是有先来后到之分。 若元素存在多个,则第一个元素无前驱,而最后一个元素无后继,其他元素都有且只有一个前驱和后继。 线性表强调是有限的,事实上无论计算机发展到多强大,他所能处理的元素都是有限的。 线性 阅读全文
posted @ 2023-04-30 18:05 酷酷- 阅读(323) 评论(0) 推荐(0) 编辑
摘要:1 前言 数据结构很基础也很重要,它重要在哪呢,当然当你的数据量比较比如就很小几十几百的,你随便用什么数据结构,当你的数据量比较大的时候,这个时候对数据操作的效率每种数据结构的特长点就会慢慢出现差异,所以我们要对数据结构有一定的认知,我们才能更好的使用相适应的数据结构来加速我们的代码,是不是,那么这 阅读全文
posted @ 2023-04-29 17:05 酷酷- 阅读(192) 评论(0) 推荐(0) 编辑
摘要:1 前言 从基础讲起,IO底层原理是隐藏在Java编程知识 之下的基础知识,是开发人员必须掌握的基本原理,可以说是基础的 基础,更是大公司面试通关的必备知识。本节从操作系统的底层原理入手,通过图文并茂的方式为大家深入剖析高并发IO的底层原理,并介绍如何通过设置来让操作系统支持高并发。 2 IO读写的 阅读全文
posted @ 2023-04-26 08:35 酷酷- 阅读(456) 评论(2) 推荐(0) 编辑
摘要:1 前言 本节我们来看另一个Java基础知识,内部类相关的东西。 2 内部类 2.1 分类 Java 类中不仅可以定义变量和方法,还可以定义类,这样定义在类内部的类就被称为内部类。根 据定义的方式不同,内部类分为静态内部类,成员内部类,局部内部类,匿名内部类四种。 2.2 静态内部类 定义在类内部的 阅读全文
posted @ 2023-04-24 06:51 酷酷- 阅读(28) 评论(0) 推荐(0) 编辑
摘要:1 前言 本节我们来看另一个Java基础知识,就是注解哈。 2 注解 2.1 概念 Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径 和方法。Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotatio 阅读全文
posted @ 2023-04-23 08:01 酷酷- 阅读(24) 评论(0) 推荐(0) 编辑
摘要:1 前言 本节我们来看一个Java利器就是反射,反射很重要是开发框架的基础核心,主要就是从类元数据信息中解析各种信息,我们就来看看。 2 反射简介 2.1 动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以引进,已有的函数可以被删除等结 构上的变化。比如常见的 JavaScript 就 阅读全文
posted @ 2023-04-23 07:25 酷酷- 阅读(79) 评论(0) 推荐(0) 编辑
摘要:1 前言 首先说下为什么会产生这样的疑惑哈,最近在看Spring-retry的时候,发现: 其次我们再来看个现象,@Component 声明了一个Bean,内部有个单例AService,当我们调用两次 aService() 发现得到的对象不一样: @Component public class De 阅读全文
posted @ 2023-04-21 09:46 酷酷- 阅读(615) 评论(0) 推荐(0) 编辑
摘要:1 前言 今天看科技类的文章发现一个新的包,还是Spring提供的,用于失败重试的,我们这节来简单看看哈。 2 spring-retry 使用 2.1 依赖引入 <dependency> <groupId>org.springframework.retry</groupId> <artifactId 阅读全文
posted @ 2023-04-20 14:51 酷酷- 阅读(306) 评论(0) 推荐(0) 编辑
摘要:1 前言 最近看阿里云的RDS数据库的数据分析,发现人家统计信息很快,于是很好奇人家怎么收集的,其实就是调的PGSQL的语句来收集的,我们这节就来看看这些数据怎么来的哈。如下图RDS的收集信息: 2 数据收集 函数表 函数名返回类型描述 pg_size_pretty(bigint|numeric) 阅读全文
posted @ 2023-04-19 08:29 酷酷- 阅读(227) 评论(0) 推荐(0) 编辑
摘要:1 前言 我们平时创建线程出来,可能会因为某种情况不想让线程继续运行了,放弃掉任务,那么这节我们就来看看如何停止一个线程。 Java中线程的stop()、suspend()、resume()三个方法都已经被弃用,所以不再使用这些方法停止线程。 2 终止方法 (1)我们只能调用线程的interrupt 阅读全文
posted @ 2023-04-19 07:06 酷酷- 阅读(294) 评论(0) 推荐(0) 编辑
摘要:1 前言 本节我们讲下Thread.yield()方法的作用,并对比下sleep()方法、wait()方法,看看三者有何区别。 2 yield 方法 作用是:提出释放CPU时间片的请求,不会释放锁,主要知道它不会阻塞线程即可哈,平时我是没怎么用过哈。特点就是:(1)yield()方法只是提出申请释放 阅读全文
posted @ 2023-04-18 22:04 酷酷- 阅读(177) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们看了线程是如何创建启动的,那么启动以后线程怎么管理呢,这就要看我们线程的状态管理了,这节我们就来看看线程都有哪些状态以及什么操作下会驱使状态的变化流转。 2 状态定义 Java线程有6种状态定义在Thread的子类State,分别是NEW、RUNNABLE、BLOCKED、WAIT 阅读全文
posted @ 2023-04-18 21:46 酷酷- 阅读(243) 评论(0) 推荐(1) 编辑
摘要:1 前言 本节开始我们来回顾下线程基础相关的东西,最近在复习所以来做一些笔记哈,这节我们来讲讲创建线程的方式。 线程指程序执行过程中的一个线程实体。JVM 允许一个应用并发执行多个线程。Hotspot JVM 中的 Java 线程与原生操作系统线程有直接的映射关系。当线程本地存储、缓冲区分配、同步对 阅读全文
posted @ 2023-04-18 20:37 酷酷- 阅读(74) 评论(0) 推荐(0) 编辑
摘要:CREATE TABLE `user_operation_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL 阅读全文
posted @ 2023-04-18 16:17 酷酷- 阅读(24) 评论(0) 推荐(0) 编辑
摘要:1 前言 看了wait()方法之后,我们再来讲讲join()方法,因为join()方法就是通过wait()方法实现的。 2 含义 让主线程等待(WAITING状态),一直等到其他线程不再活动为止。join在英语中是“加入”的意思,join()方法要做的事就是,当有新的线程加入时,主线程会进入等待状态 阅读全文
posted @ 2023-04-18 08:05 酷酷- 阅读(780) 评论(0) 推荐(0) 编辑
摘要:1 前言 本节我们来看下关于线程的一些方法,wait()、notify()、notifyAll(),来理解他们内部做的事情。 2 含义 我们先来看下这三个方法的归属,都是属于Object的方法,因为这些方法都是要跟Synchronized来搭配使用的,就涉及到锁对象,而锁对象可以是任意引用对象,所以 阅读全文
posted @ 2023-04-18 07:16 酷酷- 阅读(261) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来讨论下 Spring MVC 传统和现在的启动方式的不同,可能大家现在上手就是SpringBoot直接给我们内置Tomcat,我们最多也就是改改配置就完事了,我记得我上学的时候写SSM的时候,还要整理各种Jar包和配置,这节我们就来对比下两种启动方式是如何启动Spring MVC 阅读全文
posted @ 2023-04-17 18:05 酷酷- 阅读(484) 评论(0) 推荐(0) 编辑
摘要:1 前言 我们应该知道的是Spring MVC其实就是一个Servlet,而我i们平时使用最多的Servlet容器就是Tomcat,那么两者是如何关联到一起的呢,这节我们就来看下。 2 请求过程 我们先来从上层视角浅化的了解一下请求的处理过程,如下图: (1)用户和Tomcat间建立连接并通过网络发 阅读全文
posted @ 2023-04-17 15:51 酷酷- 阅读(1143) 评论(1) 推荐(2) 编辑
摘要:1 前言 本节我们结合wireshark抓包,对TCP协议的三次握手以及四次挥手的抓包实践。 2 TCP/IP协议族 TCP/IP是一个协议族,通常分不同层次进行开发,每个层次负责不同的通信功能。包含以下四个层次: (1)链路层,也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和对应 阅读全文
posted @ 2023-04-16 22:07 酷酷- 阅读(248) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来实际的用一用JVM平时常用的调优命令,来实际体验回顾一下。这里我直接用的是我们生产环境的一个Pod里,来真实的带大家体验一下。 2 jps jps大家应该都知道吧,就是列出当前的java进程有哪些: 3 jmap 3.1 jmap ‐histo 此命令可以用来查看内存信息,实例个 阅读全文
posted @ 2023-04-15 22:20 酷酷- 阅读(153) 评论(0) 推荐(0) 编辑
摘要:Java HotSpot VM中 -XX: 的可配置参数列表进行描述;这些参数可以被松散的聚合成三类: 行为参数(Behavioral Options):用于改变jvm的一些基础行为; 性能调优(Performance Tuning):用于jvm的性能调优; 调试参数(Debugging Optio 阅读全文
posted @ 2023-04-15 20:58 酷酷- 阅读(75) 评论(0) 推荐(0) 编辑
摘要:在PostgreSQL中可以直接对时间进行加减运算:、 SELECT now( ) :: TIMESTAMP + '1 year';--当前时间加1年SELECT now( ) :: TIMESTAMP + '1 month';--当前时间加一个月SELECT now( ) :: TIMESTAMP 阅读全文
posted @ 2023-04-14 20:41 酷酷- 阅读(1385) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节也是我们线程池的最后一节咯,我们这节来总结一下。 2 线程池总结 线程池篇我们讲解了两种线程池,一种是ThreadPoolExecutor线程池、另外一种是ScheduledThreadPoolExecutor线程池。 2.1 ThreadPoolExecutor 线程池 关于Thre 阅读全文
posted @ 2023-04-14 07:07 酷酷- 阅读(146) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来讲点别的东西,专门来分析一下定时任务、延迟任务的实现。 2 对比分析 前面我们讲解的ScheduledThreadPoolExecutor,这个线程池可以进行延迟任务、定时任务的调度,底层依赖的是DelayedWorkQueue这个阻塞队列。DelayedWorkQueue这个延 阅读全文
posted @ 2023-04-14 06:43 酷酷- 阅读(586) 评论(0) 推荐(0) 编辑
摘要:1 问题原因 生产环境系统的券表、会员信息表本身比较大,然后查询券的时候会关联会员表进行查询,本身select 并不慢大概2-3秒,但是页面查询就是慢是分页的,猜测可能就是分页查询的时候统计个数的时候慢,试着数据库执行了一下,还真是,count就要快达到一分钟了,慢的原因找到了,就是要优化这个分页统 阅读全文
posted @ 2023-04-13 08:05 酷酷- 阅读(1089) 评论(2) 推荐(0) 编辑
摘要:1 前言 上一节我们看了ScheduledThreadPoolExecutor线程池提交任务的流程。execute、submit、schedule、scheduleAtFixRate方法的原理:都是将任务封装为一个ScheduledFutureTask,然后提交到延迟阻塞队列里面,然后线程池里的线程 阅读全文
posted @ 2023-04-13 07:01 酷酷- 阅读(216) 评论(0) 推荐(0) 编辑
摘要:1 前言 前面我们主要看了ThreadPoolExecutor线程池。包括线程池内部有哪些核心的参数、每个参数的含义,通过向线程池提交任务的execute方法的内部逻辑以及执行流程是什么,通过FutureTask获取任务执行结果,以及阻塞、唤醒调用线程和线程池内部的工作者Worker的工作原理,线程 阅读全文
posted @ 2023-04-13 06:39 酷酷- 阅读(944) 评论(0) 推荐(0) 编辑
摘要:1 内容回顾 前面四节的内容我们大概看了线程池的:(1)线程池的基本用法(2)线程池种类ExecuteService这类型的线程池,代表的子类是ThreadPoolExecutor,这种类型的线程池是当有线程空闲的时候立即会执行你提交的任务。还有一种类型的线程池ScheduledExecutorSe 阅读全文
posted @ 2023-04-12 07:27 酷酷- 阅读(404) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们看了ThreadPoolExecutor线程池的核心参数、怎么通过这些参数构建和设计线程池的、向线程池提交任务的execute方法内部流程、线程池内部Worker工作者的原理,今天就来看一下ThreadPoolExecutor线程池一些其它方法,比如线程池的预热、关闭、线程池的一 阅读全文
posted @ 2023-04-12 06:46 酷酷- 阅读(1118) 评论(1) 推荐(1) 编辑
摘要:1 前言 上一节我们看了ThreadPoolExecutor线程池的execute内部方法流程,addWorker方法流程,看到Worker是线程池内部的工作者,每个Worker内部持有一个线程,addWorker方法创建了一个Worker工作者,并且放入HashSet的容器中,那么这节我们就来看看 阅读全文
posted @ 2023-04-11 21:18 酷酷- 阅读(321) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们看了线程池的状态和数量的计数以及提供的拒绝策略,这节我们就要看线程池的运行原理,那么在了解原理之前不知道大家对线程池有没有这样的疑问:比如线程池的线程数量是怎么进行增长的?随着任务的不断提交,线程池中的线程数量什么时候线程数量达到corePoolSize?什么时候线程数达到max 阅读全文
posted @ 2023-04-11 21:02 酷酷- 阅读(564) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们对线程池以及它的基本使用做了介绍,后面我们就开始分析线程池内部的原理了,内部的核心流程是怎么设计的,那么这节我们先来分析一下ThreadPoolExecutor这个线程池的有哪些属性,以及这些属性代表什么意思。 2 线程池状态和线程数量的表示 首先来看下ThreadPoolExe 阅读全文
posted @ 2023-04-10 15:25 酷酷- 阅读(301) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节开始我们主要是攻克一下Java中的线程池,来深入的分析一下线程池是怎么设计的,线程池的原理是什么等,只有更好的理解原理,才能很好的使用并且规避掉一些问题,那么本节我们先简单介绍下线程池是什么以及平时大家的使用方法。 2 认识线程池 首先大家要知道为什么要有线程池? Java线程的创建非 阅读全文
posted @ 2023-04-10 07:39 酷酷- 阅读(249) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们讲解了HashMap底层的实现,但是HashMap不是线程安全的,存在多个线程并发操作的线程安全的问题。今天我们就来看一下ConcurrentHashMap这个数据结构,并发安全版本的Map结构。 2 ConcurrentHashMap内部源码 2.1 内部属性 // 最大容量上 阅读全文
posted @ 2023-04-10 06:36 酷酷- 阅读(93) 评论(0) 推荐(0) 编辑
摘要:1 前言 前几节我们分析了一些并发安全的数据结构,分别是CopyOnWrite系列的CopyOnWriteArrayList、BlockingQueue阻塞队列系列的LinkedBlockingQueue、ArrayBlockingQueue、DelayQueue。接下来我们要讲解一个很重要的并发安 阅读全文
posted @ 2023-04-09 22:35 酷酷- 阅读(63) 评论(0) 推荐(1) 编辑
摘要:1 前言 看过了LinkedBlockingQueue、ArrayBlockingQueue、DelayQueue等阻塞队列,这节我们又要看一个不一样的队列,SynchronousQueue同步阻塞队列。 2 SynchronousQueue是什么 SynchronousQueue的同步队列,使用的 阅读全文
posted @ 2023-04-09 21:13 酷酷- 阅读(73) 评论(0) 推荐(0) 编辑
摘要:1 前言 前两节我们看了BlockingQueue阻塞队列的两个子类,LinkedBlockingQueue、ArrayBlockingQueue,它们都是使用了ReentrantLock、Condition的来实现的,在进行插入操作、拉取数据操作之前为了并发安全都需要进行加锁;然后插入时候在容量满 阅读全文
posted @ 2023-04-09 19:46 酷酷- 阅读(207) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们就来看看ArrayBlockingQueue内部实现的原理。ArrayBlockingQueue阻塞队列是基于数组来实现的,上一章节的LinkedBlockingQueue是基于链表来实现的。ArrayBlockingQueue内部的实现机制跟LinkedBlockingQueue 阅读全文
posted @ 2023-04-09 18:16 酷酷- 阅读(68) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们就来看看LinkedBlockingQueue内部实现的原理。 2 LinkedBlockingQueue的使用 在看原理之前我们先来用一用LinkedBlockingQueue,来体验一下: 2.1 插入数据 public class LinkedBlockingQueueTes 阅读全文
posted @ 2023-04-09 15:20 酷酷- 阅读(119) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们就来看看BlockingQueue阻塞队列是什么都有哪些具体实现。 2 BlockingQueue阻塞队列是什么 BlockingQueue阻塞队列,它是一个提供阻塞功能的队列容器。首先它是一个队列容器,能够存储东西,提供数据入队功能,进行数据存入;提供数据取出功能,进行出队,如下 阅读全文
posted @ 2023-04-09 13:17 酷酷- 阅读(72) 评论(0) 推荐(0) 编辑
摘要:1 前言 我们前面看过了volatile、synchronized以及AQS的底层原理,以及基于AQS之上构建的各种并发工具,ReentrantLock、CountDownLatch、Semaphore、CyclicBarrier,那么我们这节该看什么了,是不是要看运用了。在日常的业务编程中经常使用 阅读全文
posted @ 2023-04-08 23:45 酷酷- 阅读(116) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们看了下ReentrantReadWriteLock读写锁的写锁的申请和释放过程,这节我们就来看下读锁的。 2 线程读锁记录 回顾一下之前的例子,在读写并发操作的时候,读取数据的时候加读锁: public class ReentrantReadWriteLockTest { // 声 阅读全文
posted @ 2023-04-08 12:18 酷酷- 阅读(73) 评论(0) 推荐(0) 编辑
摘要:1 前言 上节我们看了下ReentrantReadWriteLock读写锁的属性以及内部结构,我们回顾下:(1)ReentrantReadWriteLock内部有两把锁,读锁ReadLock、写锁WriteLock,基于AQS实现的读写锁并发工具Sync;其中无论读锁还是写锁都是基于Sync进行封装 阅读全文
posted @ 2023-04-07 23:24 酷酷- 阅读(68) 评论(0) 推荐(0) 编辑
摘要:1 前言 接下来我们来看看ReentrantReadWriteLock读写锁,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类,这个锁很重要,在很多开源的中间件中使用的非常广泛,很多场景使用它来减少并发操作中的锁冲突,提升并发能力。 2 ReentrantReadWriteLo 阅读全文
posted @ 2023-04-07 22:03 酷酷- 阅读(78) 评论(0) 推荐(0) 编辑
摘要:1 前言 接下来我们来看看Semaphore,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类。 2 Semaphore是什么 Semaphore,它是一个信号量,主要作用是用来控制并发中同一个时刻执行的线程数量,可以用来做限流器,或者流程控制器。在创建的时候会指定好它有多少个 阅读全文
posted @ 2023-04-07 16:47 酷酷- 阅读(369) 评论(0) 推荐(0) 编辑
摘要:1 前言 接下来我们来看看CyclicBarrier,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类,依赖了ReentrantLock。 2 CyclicBarrier是什么 CyclicBarrier,就是一个计数器栅栏,也就是一个计数器开关。比如CyclicBarrier 阅读全文
posted @ 2023-04-07 08:32 酷酷- 阅读(202) 评论(0) 推荐(0) 编辑
摘要:1 前言 接下来我们来看看CountDownLatch,也是基于之前讲解的AQS来实现的,建立在AQS体系之上的一个并发工具类。 2 CountDownLatch是什么 CountDownLatch类似一个有多道锁的门闩,CountDownLatch在创建的时候就指定好有多少道锁链了。假如有个门闩 阅读全文
posted @ 2023-04-07 07:35 酷酷- 阅读(209) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们深入分析了ReentrantLock公平锁、非公平锁底层的源码实现,这节就分析ReentrantLock提供的另外一个机制,Condition机制的底层实现。 2 什么是Condition,是干什么的 ReentrantLock提供的这个Condition功能,底层还是基于AQS 阅读全文
posted @ 2023-04-06 22:36 酷酷- 阅读(422) 评论(0) 推荐(0) 编辑
摘要:1 前言 先回顾下我们前面讲解的,AQS作为基础的并发框架为我们提供了: (1)AQS作为一个并发的基础框架,定义了资源,规定了获取资源的入口、释放资源的入口,定义了等待队列,同时还有一套机制规定了获取锁失败的线程进入等待队列等待,以及资源释放的时候怎么唤醒等待队列的线程重新竞争锁等。(2)深入的剖 阅读全文
posted @ 2023-04-06 17:22 酷酷- 阅读(155) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们详细讲解了基于AQS实现的互斥锁机制,进行了深入的剖析,包括从acquire入口源码开始,剖析了获取锁失败调用addWaiter方法加入等待队列,知道了Node节点是怎么插入等待队列的;同时还剖析acquireQueue方法的源码,解析了插入等待队列之后的节点什么时候被挂起,什么 阅读全文
posted @ 2023-04-06 07:59 酷酷- 阅读(173) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们从整体上分析了什么是AQS以及AQS内部的数据结构,那么这节我们就从acquire和release入手,分析一下AQS为独占锁提供的机制:到底是怎么在获取资源失败进入等待队列的?以及释放资源的时候怎么唤醒后继节点的线程竞争锁的? 2 acquire 方法源码解析 首先我们看一下A 阅读全文
posted @ 2023-04-05 21:40 酷酷- 阅读(226) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来开始看 AQS,这个东西可以说是搞Java的都知道的,本节会介绍一下AQS以及它提供的基本机制,后面再对AQS提供的每一个机制一个个深入的剖析。 2 什么是AQS?(同步器基础框架) AQS叫做抽象队列同步器(AbstractQueuedSynchronizer),它是一个实现了 阅读全文
posted @ 2023-04-05 16:22 酷酷- 阅读(315) 评论(0) 推荐(1) 编辑
摘要:1 前言 上一节我们对LongAdder的底层源码、实现机制进行了深入了剖析,包括AtomicInteger在高并发竞争下导致的大量自旋的问题,以及LongAdder是怎么使用分段锁优化这个问题的。我们最后看到longAccumulate托底的方法,这一节我们来深入的分析一下Striped64的分段 阅读全文
posted @ 2023-04-04 15:07 酷酷- 阅读(162) 评论(0) 推荐(0) 编辑
摘要:1 前言 上一节我们讲解了cas的缺陷,无法同时更新多个变量、以及ABA的问题。以及如果使用AtomicReference解决同时更新多个变量,如果使用AtomicStampedReference解决ABA的问题,这节我们就来讲解CAS带来的另外一个问题,在并发激烈的时候,产生大量的自旋,空耗CPU 阅读全文
posted @ 2023-04-04 08:11 酷酷- 阅读(246) 评论(0) 推荐(2) 编辑
摘要:1 前言 上节我们看了AtomicInteger、AtomicBoolean的原理,这一篇我们就来说说Atomic系列的另一个分类AtomicReference和AtomicStampReference。 2 多个变量修改的原子性 JUC虽然提供了AtomicInteger、AtomicBoolea 阅读全文
posted @ 2023-04-04 06:56 酷酷- 阅读(204) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们从AtomicInteger这个比较简单的原子类开始,来看看AtomicInteger的底层原理。 2 实测样例对比线程安全性 在说AtomicInteger的底层原理之前呢,我们先来看个例子感受下原子类: static修饰的共享变量,我们开启两个线程对共享变量进行10000次+1 阅读全文
posted @ 2023-04-03 23:13 酷酷- 阅读(254) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们就开始看看Atomic原子类系列,JUC包下提供的原子类底层的实现原理基本都是差不多的,都是基于volatile和CAS操作来保证线程安全的,我们后续会着重分析几个类。 2 概览 我们看下JUC下边都有哪些原子类: 看上面的图形,我们使用红色圈中的那些,就是我们要着重讨论的,一共分 阅读全文
posted @ 2023-04-03 22:14 酷酷- 阅读(118) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来看看JDK底层的unsafe,因为很多的操作都是依赖于unsafe提供的功能的。 2 unsafe是什么? unsafe是JDK提供的一个工具类,里面的方法大多是native方法,unsafe类是JDK给你提供的一个直接调用操作系统底层功能的一个工具类,unsafe提供了非常多操 阅读全文
posted @ 2023-04-03 16:46 酷酷- 阅读(445) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来看看synchronized是怎么保证原子性、可见性、有序性。 2 原子性 通过前面的篇章我们知道 synchronized 底层实际上通过JVM来实现的,同一时间只能有一个线程去执行synchronized 中的代码块。 原子性:既然同一时间只有一个线程去运行里面的代码,那么这 阅读全文
posted @ 2023-04-03 07:53 酷酷- 阅读(207) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们来看看synchronized的锁重入、锁优化、和锁升级的原理。 2 synchronized锁重入 所谓锁重入,就是支持正在持有锁的线程支持再次获取锁,不会出现自己锁死自己的问题。 比如以下的代码: synchronized(this) { synchronized(this){ 阅读全文
posted @ 2023-04-03 07:29 酷酷- 阅读(199) 评论(0) 推荐(0) 编辑
摘要:1 前言 之前我们说过对象头的信息,这节我们就来看看synchronized是怎么通过monitor进行重量级加锁。 2 内容回顾 我们先来回顾下Mark Word的内容: 当Mark Word的最后两位的锁标志位是10的时候,Mark Word这哥们说自己处于重量级锁的模式,重量级加锁不是它的责任 阅读全文
posted @ 2023-04-02 21:57 酷酷- 阅读(285) 评论(0) 推荐(0) 编辑
摘要:1 前言 这节我们就来看看volatile怎么通过内存屏障保证可见性和有序性。 2 保证可见性 volatile修饰的变量,在每个读操作(load操作)之前都加上Load屏障,强制从主内存读取最新的数据。每次在assign赋值后面,加上Store屏障,强制将数据刷新到主内存。 以volatile i 阅读全文
posted @ 2023-04-02 15:43 酷酷- 阅读(303) 评论(0) 推荐(0) 编辑
摘要:1 前言 volatile是java语言提供的一个关键字,用来修饰变量的,使用volatile修饰的变量可以保证并发安全的可见性和有序性。 volatile int i = 0; public void add() { i++; } 使用方法就是声明变量之前加一个volatile关键字,然后变量 i 阅读全文
posted @ 2023-04-02 14:42 酷酷- 阅读(441) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示