java并发编程
文章平均质量分 84
*吴聪聪*
少说、多做
展开
-
AbstractQueuedSynchronizer(AQS) 源码细致分析 - Semaphore 源码分析
1、简介Semaphore,信号量,它保存了一系列的许可 (permits),每次调用 acquire() 方法都将消耗一个许可,每次调用 release() 方法都将归还一个许可。Semaphore 通常用于限制同一时间对共享资源的访问次数上,也就是说常说的限流。Semaphore 信号量,获取同行证流程图。2、入门案例案例1public class Pool { /** * 可同时访问资源的最大线程数 */ private static fina原创 2022-02-18 15:04:41 · 260 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS) 源码细致分析 - CyclicBarrier 源码分析
1、简介**CyclicBarrier **,回环栅栏,它会阻塞一组线程直到这些线程同时达到某一个条件才继续执行。它与 CountDownLatch 很类似,但是又不同,CountDownLatch 需要调用 countDown() 方法触发事件,而 CyclicBarrier 不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。工作原理图CyclicBarrier 与 CountDownLatch 的异同?两者都能实现阻塞一组线程被唤醒;前者是最后一个线程到达的时候自动唤原创 2022-02-17 17:16:34 · 469 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS) 源码细致分析 - Condition 条件队列流程分析
AbstractQueuedSynchronizer(AQS) 源码细致分析 - Condition 条件队列流程分析AQS 源码探究 Condition 条件队列 (手写一个入门的 BrokingQueue)1、Condition 队列介绍AQS 中还有另一个非常重要的内部类 ConditionObject,它实现了 Condition 接口,主要用户实现条件锁。ConditionObject 中也维护了一个队列,这个队列主要用于等待条件的成立,当条件成立,其他线程将 signal 这个队列原创 2022-02-17 13:41:09 · 344 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS) 源码细致分析 - CountDownLatch 源码分析
AbstractQueuedSynchronizer(AQS) 源码细致分析 - CountDownLatch 源码分析1、CountDownLatch 简介CountDownLatch,是一个简单的同步器,它的含义是 允许一个或者多个线程等待其他线程的操作执行完毕后再执行后续的操作。CountDownLatch 的通常用法和 Thread.join() 有点类似,等待其他线程都完成后再执行主任务。2、入门案例分析案例1:对于像我一样的学生来说,CountDownLatch 的实际开发应用原创 2022-02-17 11:04:02 · 375 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS) 源码细致分析 - 释放锁、响应中断加锁流程分析
AQS 成员方法解析 - 释放锁逻辑1、unlock() 方法:释放锁// 位于ReentrantLock类中:释放锁的方法public void unlock() { //释放锁 sync.release(1);}// 位于AQS的静态内部类Sync中:真正释放锁的方法// RentrantLock.unlock() -> sync.release()public final boolean release(int arg) { // tryRelease.原创 2022-02-15 16:25:26 · 158 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS) 源码细致分析 - 加锁竞争资源分析
1、简介AQS 的全称是 AbstractQueuedSynchronizer,它的定位是为 JAVA 种几乎所有的锁和同步器提供一个基础框架AQS 是基于 FIFO 队列实现的,并且内部维护了一个状态变量 state,通过原子更新这个状态变量 state 即可实现加锁解锁操作。主要内部类 Nodestatic final class Node { /** Marker to indicate a node is waiting in shared mode */ // 枚举原创 2022-02-15 15:41:40 · 285 阅读 · 0 评论 -
AQS 源码探究_01 手写一个简化的 ReentrantLock 可重入锁
AQS 源码探究_01 手写一个简化的 ReentrantLock 可重入锁完整代码Lock/** * @author wcc * @date 2022/2/10 22:13 */public interface Lock { void lock(); void unlock();}MinReentrantLockimport sun.misc.Unsafe;import java.lang.reflect.Field;import java.util.conc原创 2022-02-11 19:42:33 · 213 阅读 · 0 评论 -
JDK1.8 ConcurrentHashMap 源码方法解析 02
put() 方法是并发 HashMap 源码分析的重点方法,这里涉及到并发扩容,桶位寻址等等…JDK1.8 ConcurrentHashMap 的结构图:1、put(K key, V value) 方法源码解析// 向并发 HasHMap 中put一个数据public V put(K key, V value) { return putVal(key, value, false);}// 向并发 HashMap 中put一个数据// key:数据的key// value:数据的.原创 2022-01-24 23:26:28 · 429 阅读 · 0 评论 -
JDK1.8 ConcurrentHashMap源码细致分解01
文章参考:小刘讲源码ConcurrentHashMap 源码解析_01 成员属性、内部类、构造方法解析1、简介ConcurrentHashMap 是 HashMap 的线程安全版本,内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。相比于同样线程安全的 HashTable 来说,效率等等各方面都有极大的提升。在学习 ConcurrentHashMap 源码之前,这里默认大家已经读过 HashMap 源码,了解 LongAdder 原子类、红黑树。参考:红黑树学习笔记(自己实现一个简单.原创 2022-01-18 13:22:54 · 601 阅读 · 0 评论 -
JDK 8 新特性 LongAdder 源码解析
1、LongAdder 由来LongAdder 类是JDK 1.8新增的一个原子性操作类。AtomicLong 通过 CAS 算法提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说性能已经是很好了,但是 JDK 开发者并不满足于此,因为经常搞并发的请求下 AtomicLong 的性能是不能让人接受的。如下 AtomicLong 的 getAndIncrement 的代码,虽然 AtomicLong 使用 CAS 算法,但是在高并发的情况下, CAS 只能有一个线程操作成功,其他线程失败后还是通过无限原创 2022-01-07 20:52:01 · 607 阅读 · 0 评论 -
JAVA 并发基石 - CAS 原理实战
本文根据小刘老师视频而出:Java并发基石-CAS原理实战在学习 CAS 之前,先从一个简单的 案例入手,进而引出 CAS 的基本使用。基于 CAS 的网站计数器需求:我们开发一个网站,需要对访问量进行统计,用户每发送一次请求,访问量 + 1,如何实现?我们模拟有 100 个人同时访问,并且每个人对咱们的网站发起 10 次请求,最后总访问次数应该是 1000次1.1、网站访问统计 Demo/** * @author wcc * @date 2022/1/6 13:45 */publi原创 2022-01-06 18:22:48 · 410 阅读 · 2 评论 -
JMM内存模型、volatile关键字保证有序性和可见性相关问题总结
JMM内存模型、volatile关键字保证有序性和可见性相关问题总结1、什么是JAVA内存模型?首先要知道,JAVA内存模型指的是JMM,而不是运行时数据区哦~JAVA语言为了保证并发编程中可以满足原子性、可见性以及有序性,于是推出了一个概念就是JMM内存模型。JMM内存模型,目的是为了在多线程条件下,使用共享内存进行数据通信的时候,通过对多线程程序读操作、写操作行为规范约束,来尽量避免多次内存数据存取不一致,编译器对代码指令重排序、处理器对代码乱序执行等带来的问题。JMM内存模型将主要划分为原创 2021-10-09 19:18:34 · 150 阅读 · 0 评论 -
ThreadLocal源码夺命12问,你能坚持到第几问?
ThreadLocal源码面试1、面试官:请你说一说你对ThreadLocal的理解?ThreadLocal是一个全局对象,ThreadLocal是线程范围内变量共享的解决方案;threadLocal可以看作是一个map集合,key就是当前线程对象,value就是要存放的变量。ThreadLocal对象可以给每个线程分配一份属于自己的局部变量副本,多个线程之间可以互不干扰。一般我们会重写initivalue()方来给当前ThreadLocal对象赋初始值。2、面试官:简单描述一下JDK1.8中,原创 2021-10-03 20:42:31 · 183 阅读 · 0 评论 -
ThreadLocal源码分析_02内核(ThreadLocalMap)
ThreadLocal源码分析_02内核(ThreadLocalMap)本篇主要介绍ThreadLocal的内核ThreadLocalMap(ThreadLocal的静态内部类),在学习ThreadLocalMap内核之前,再来复习一下ThreadLocal的执行流程:下面就正式分析一下ThreadLocalMap的原理:1、成员属性 /** * 初始化当前map内部散列表数组的初始长度 */ private static fina原创 2021-10-03 20:41:49 · 115 阅读 · 0 评论 -
ThreadLocal源码分析_01入门案例以及表层源码分析
ThreadLocal源码分析_01入门案例以及表层源码分析1、ThreadLocal简介ThreadLocal是一个全局对象,ThreadLocal是线程范围内变量共享的解决方案;**ThreadLocal可以看作是一个map集合,key就是当前线程,value就是要存放的变量。**eg如下://声明一个ThreadLocal实例ThreadLocal threadLocal = new ThreadLocal();//随机获取一个数字hint n = new Random().nextI原创 2021-10-03 20:40:56 · 98 阅读 · 0 评论 -
JAVA并发与多线程相关面试题总结
JAVA并发与多线程相关面试题总结1、什么是进程、线程、协程,它们之间的关系是怎样的?进程:本质上是一个独立执行的程序,是计算机中的程序关于数据集合上的一次运行活动,进程是操作系统进行资源分配和调度的基本概念,操作系统进行资源分配和调度的一个独立单位。线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一个进程中可以并发多个线程,每个线程执行不同的任务,切换受操作系统控制。协程:又称为微线程,是一种用户态的轻量级线程,协程不像线程和进程原创 2021-10-02 10:14:26 · 423 阅读 · 1 评论 -
多线程中Thread的join方法
多线程中Thread的join方法join简介join方法是Thread类中的一个方法,该方法的定义是等待该线程执行直到终止。其实就说join方法将挂起调用线程的执行,直到被调用的对象完成它的执行。join实例(以一道面试题为例)现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完之后执行,T3在T2执行完后执行?这个问题是网上很热门的面试题(这里除了join还有很多方法能够实现,只是使用join是最简单的方案),下面是实现的代码:/** * @author wcc * @date 20原创 2021-09-21 09:46:30 · 30239 阅读 · 5 评论 -
多线程中的指令重排序问题
java并发编程中的重排序问题重排序在多核处理器的环境下,编写的顺序结构,这种操作执行的顺序可能是没有保障的:编译器、处理器可能会改变两个操作的先后顺序这种一个处理器上执行的多个操作,在其他处理器来看它的顺序与目标代码指定的顺序可能是不一样的,这种现象称为重排序。重排序是对内存访问有序操作的一种优化,可以在不影响单线程程序正确的情况下提升程序的性能,但是,可能对多线程程序的正确性产生影响,即可能产生线程安全问题。重排序与可见性问题类似,不是必然出现的,与内存操作顺序有关的几个概念:源代码执行原创 2021-09-20 21:41:44 · 1027 阅读 · 1 评论