
java多线程
不会写代码的丝丽
这个作者很懒,什么都没留下…
展开
-
java 原子类累加器
前言LongAccumulatorDoubleAccumulator在多线程进程情况,我们可能希望计算某一共享变量,如页面访问次数,商品剩余数量秒杀。本文仅用LongAccumulator做说明。LongAccumulator原创 2020-11-15 21:54:39 · 911 阅读 · 0 评论 -
java CAS包装类概述
原子更新基本类型:AtomicBooleanAtomicIntegerAtomicLong原子更新数组:4. AtomicIntegerArray5. AtomicReferenceArray6. AtomicReference原子更新引用7. AtomicReference8. AtomicRefernceFieldUpdater9. AtomicMarkableReference原子更新字段AtomicIntegerFieldUpdaterAtomicLongField原创 2020-11-09 18:09:58 · 287 阅读 · 0 评论 -
Atomic 特殊标记类
前言JDK提供了两个额外附加信息的Atomic帮助类,主要处理ABA类问题AtomicMarkableReferenceAtomicStampedReferenceAtomicMarkableReference额外添加了一个Boolean字段在其中,可以根据业务场景使用,如避免ABA问题,可是视为AtomicStampedReference精简版。AtomicStampedReference额外添加了一个Long类型字段在其中,可以避免ABA问题,甚至可以知道经过几次变化,相比Atom原创 2020-11-09 14:10:24 · 217 阅读 · 0 评论 -
java Atomic 字段类更新
我们会在某些需求下想要原子性更新某个类的某些字段,所以JUC提供了如下函数AtomicReferenceFieldUpdaterAtomicLongFieldUpdaterAtomicIntegerFieldUpdater本文仅使用AtomicReferenceFieldUpdater作为说明。下面是一个需求实例:我们有n个线程,每个线程需要从Conductor获取一个唯一的票id。class Conductor { //必须是volatile属性 volatile lo原创 2020-11-08 21:44:13 · 220 阅读 · 0 评论 -
java Atomic 数组类
前言我们看下Atomic对于数组类的封装AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray我们这里以AtomicLongArray 来做说明。为什么需要退出数组类别的原子操作类?可见性问题原子性操作问题此类问题可以查看博主另一篇文章: java Atomic 基本数据类型函数说明AtomicLongArray 类方法如下:length()数组长度get(int i)具有volatile读特性方式读取数组原创 2020-11-01 23:41:07 · 338 阅读 · 0 评论 -
java Atomic 基本数据类型
前言本文讲解如下三个基本类型的原子帮助类。AtomicIntegerAtomicBooleanAtomicLong由于三个类所提供的函数都差不多我们以AtomicLong为例进行说明。我们首先看下我们为何需要原子帮助类。Long类型写操作不是原子性,会分为两个32位进行写入(读取是原子性,可以查看网上相关文献)。++i操作非原子性多线程可见性问题多线程数据竞争相关问题,如并发修改其中举例如下:假设 业务逻辑A和业务逻辑B只能执行一个,但是在上诉代码中有可能同原创 2020-11-01 14:33:20 · 877 阅读 · 0 评论 -
ArrayBlockingQueue 迭代器
ArrayBlockingQueue 是一个多线程容器,但是为了方便读者只管的理解,本文所有理解都在单线程下做演示效果,但是多线程的结果是一样。ArrayBlockingQueue 迭代器比较特殊:他不会像HashMap那样会出现ModifyException异常可以遍历出新插入的元素(前提是迭代前没有删除过全部元素的行为)会自动跳过其他线程删除的元素。(但是不会跳过第一个元素)如果迭代器和ArrayBlockingQueue相差两个循环操作以上,那么迭代器无效但是可以输出开始遍历第一个元素原创 2020-10-29 22:25:43 · 1088 阅读 · 0 评论 -
java 阻塞队列 ArrayBlockingQueue分析
sad原创 2020-10-25 21:44:52 · 377 阅读 · 0 评论 -
SynchronizedXXX 系列并发容器分析
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar原创 2020-10-18 21:04:56 · 227 阅读 · 0 评论 -
ConcurrentHashMap 迭代器相关
在常规的HasMap或者ArrayList容器中一个线程再遍历中,其他线程插入或者删除会引起迭代器错误异常。ConcurrentHashMap可以支持并发情况下遍历元素 且可以感知到元素更新。例子我们看以下例子import java.util.Enumeration;import java.util.concurrent.ConcurrentHashMap;import java.util.concurrent.TimeUnit;public class Main { public.原创 2020-10-11 18:04:43 · 1391 阅读 · 1 评论 -
ConcurrentHashMap addCount分析·
ConcurrentHashMap中addCount用于添加记录数和扩容判断添加记录我们首先分析添加记录数逻辑。第一次调用addCount函数下面的代码仅分析第一次调用时候//ConcurrentHashMap.java //@Contended注解是false shared(伪共享)相关知识可以参考本文引用文章 @sun.misc.Contended static final class CounterCell { volatile long value;原创 2020-10-07 18:30:44 · 1401 阅读 · 0 评论 -
ConcurrentHashMap transfer分析·
文章目录前言transfer初始化transfer哈希桶范围确定transfer 拷贝旧数据到新的哈希表参考文献前言本文分析1.8之下的源码。本文需要读者之前对HashMap有一定了解,如HashMap中的红黑树和链表等。我们回顾下HashMap基本结构:ConcurrentHashMap的扩容算法极其精妙,也是最晦涩难懂的部分.我首先将代码分段梳理各个部分的功能,在做细节说明。//ConcurrentHashMap.java private final void transfer(No原创 2020-10-07 00:18:38 · 967 阅读 · 1 评论 -
ReentrantLock Condition 分析
文章目录前言一、Condition类结构二、源码分析获得对象流程await 流程signal 流程前言Condition可以快速的帮助我们实现条件阻塞需求一、Condition类结构await:释放当前持有锁,然后进入休眠signal:唤醒进入休眠的线程其中有两个重要字段firstWaiter和lastWaiter。这两个字段会在ConditionObject中构造一个新的链表,用于存在await后休眠的线程,笔者在本文中称为,等候队列(等候列表)。而最原始的AQS链表笔者称为获取锁队列原创 2020-10-02 23:43:02 · 337 阅读 · 0 评论 -
ReentrantLock 超时锁2
本文需要前置知识,请参阅ReentrantLock 解决锁分析 1文章目录例子例子 ReentrantLock reentrantLock = new ReentrantLock(false); new Thread(new Runnable() { @Override public void run() { reentrantLock.lock(); .原创 2020-09-21 00:13:40 · 857 阅读 · 0 评论 -
ReentrantLock 锁分析 1
在阅读本文应对AQS有一定基础了解,可参阅博主其他博文AQS分析1-基于AQS自定义锁分析文章目录前言一、ReentrantLock基础用法二、类结构1.引入库2.读入数据总结前言ReentrantLock是一个基于AQS的可重入锁,实现了公平锁,非公平,超时,条件变量等一、ReentrantLock基础用法public class Main { public static void main(String[] args) { /** * 构造.原创 2020-09-20 18:24:12 · 406 阅读 · 0 评论 -
ASQ分析1-基于AQS自定义锁分析
AQS是并发包非常重要的基础锁类,我们看下如何利用其快速实现一个公平锁.public class SimpleLock extends AbstractQueuedSynchronizer { @Override protected boolean tryAcquire(int arg) { boolean compareAndSetState = compareAndSetState(0, 1); if (compareAndSetState) {原创 2020-09-06 01:08:41 · 369 阅读 · 0 评论 -
自旋锁 CLH和CMS
在JAVA 中concurrent包中大多数API借助AQS完成,而AQS核心又在于CLH自旋锁上。The java.util.concurrent Synchronizer Framework原创 2020-08-23 21:40:03 · 542 阅读 · 0 评论 -
我所理解的JMM--6 final内存语义
我们直接看一个如下代码然后引出问题:class FinalExample { int i; FinalExample(int i) { this.i = i; }}public class Main { static FinalExample finalExample; public static void main(String[] args) { Thread thread = new Thread(() -> fina原创 2020-08-16 16:50:16 · 262 阅读 · 0 评论 -
我所理解的JMM--5 volatile内存语义
综述本文讲解volatile在jsr 133规范内存语义,本文需要前置知识(1) new 是否为原子操作 博主对new的理解文章(2) 内存屏障 博主内存屏障知识点文章我们先看看volatile具有哪些功能(1) 保证long,double是单次读写的原子性(2) 变量的可见性(3) 基于happer-before规则下禁止重排序(1)保证long,double是单次读写的原子性背景硬件知识:数据总线:用于传输的管道.我们常规的现代化pc数据总线往往都低于64位.(64 位cp原创 2020-08-09 22:24:41 · 317 阅读 · 0 评论 -
我所理解的JMM--4 happen-before
Happen-Before 概述Happen-Before后文简写为HB.HB是JMM原创 2020-08-02 21:09:34 · 313 阅读 · 0 评论 -
我所理解的JMM--3 内存屏障
内存屏障(Memory Barriers)内存屏障可以说是一些指令集,作用于cpu和编译器大致作用:防止屏障指令前后代码乱序,乱序包括内存顺序,和执行顺序。理解内存屏障对于理解理解JMM至关重要。因为不管是volatile和happer-before都需底层插入内存屏障实现。文本以x86架构说明。现代化cpu结构读取流程:cpu从内存读取数据,然后放入L1,L2缓存区,然后从L1 L2存缓存区放入Load Buffer,最后由Cpu寄存器读取,二次读取的时候从Load Buffer读取即可,如原创 2020-07-19 22:57:30 · 1177 阅读 · 0 评论 -
我所理解的JMM-- 2 new原子性
概述文本探讨构造函数是否为原子性问题。案例我们首先如下代码:public class Person { public int age; public Person() { age=20; }}//构造对象public class JavaMain { public static void main(String[] args) { Person person = new Person(); }}原创 2020-07-19 16:18:00 · 601 阅读 · 0 评论 -
我所理解的JMM-- 1概述
JSR 是什么?JSR是Java Specification Requests全称,用于制定java规范的东西。我们的JMM就是制定在JSR中。本文仅讨论JSR133.JMM是什么JMM 是 JAVA Memory Model ,它定义了虚拟机和编译器所需要遵守的规则。JMM存在的意义多线程通信方式大体上分为两种形式:1.消息传递2.共享内存两者分别有各自的优劣:(1)消息传递:往往依赖于事件循环,效率略低,但不需要考虑多线并发问题,如Dart语言便是其中一个。(2)共享内存:多线程共享原创 2020-07-14 00:32:36 · 396 阅读 · 0 评论