JUC
文章平均质量分 86
NocturneMK
这个作者很懒,什么都没留下…
展开
-
Java 并发编程四篇 -(JUC、AQS 源码、ReentrantLock 源码)
并发编程已完结,章节如下:Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)Java 并发编程下篇 -(线程池)Java 并发编程下篇 -(JUC、AQS 源码、ReentrantLock 源码)5、J.U.CAQS 原理1、概述全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架2、特点用原创 2021-07-13 11:34:42 · 289 阅读 · 0 评论 -
Java 并发编程三篇 -(线程池)
Java 并发编程下篇 -(线程池)并发编程已完结,章节如下:Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)Java 并发编程下篇 -(线程池)Java 并发编程下篇 -(JUC、AQS 源码、ReentrantLock 源码)七、共享模型之工具1、线程池池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思原创 2021-07-11 19:40:44 · 132 阅读 · 0 评论 -
多线程(七)ThreadLocal源码
1.简单聊一聊什么是ThreadLocal?以及它的大概用途(1) 定义 (2)作用ThreadLocal的作用是提供局部变量给线程内部使用。也就是说,它使用了一套机制保证:你new了一个变量threadLocal,在一个线程里,给threadLocal变量set一个别的线程无法访问使用的类型A的实例a,然后一段时间后,你可以从threadLocal变量中get出实例a,重点是这个threadLocal变量是可以跨线程的。同时,JDK建议你把这个threadLocal变量设置为static,因为他原创 2021-07-07 09:59:24 · 136 阅读 · 0 评论 -
Java 并发编程二篇 -(JMM、CAS 原理、Volatile 原理)
并发编程已完结,章节如下:Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)Java 并发编程下篇 -(线程池)Java 并发编程下篇 -(JUC、AQS 源码、ReentrantLock 源码)四、共享模型之内存1、Java 内存模型(JMM)JMM 即 Java Memory Model,它定义了主存(共享内存)、工作内存(线程私有)抽象概念,原创 2021-07-04 17:18:06 · 241 阅读 · 0 评论 -
Java 并发编程一篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)
一、基本概念1、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)线程一个进程之内可以分为一到多个线程原创 2021-06-29 21:01:29 · 426 阅读 · 0 评论 -
多线程(六)LongAdder源码
1 LongAdder结构分析1.1 为什么要有LongAdderAutomicLong底层使用了CAS操作来控制并发的。在并发量级比较小的情况下,线程冲突的概率比较小,自旋次数少。但是,高并发的情况下,多个线程同时进行自旋操作,就会出现大量失败并一直自旋的情况,这个时候AutomicLong的性能就下降了。所以引入了LongAdder,解决高并发环境下AtomicLong自旋瓶颈的问题。1.2 Longadder的结构其结构如下,当线程不存在竞争的时候,首先将值写入到base中,当线程之间有竞争时原创 2021-06-28 00:04:52 · 184 阅读 · 0 评论 -
Java的对象模型
原文链接对象在堆内存的布局分为三个区域:分别是对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)对象头:对象头包括两部分信息分别是Mark World(_mark)和元数据(_metadata),Mark World用于存储对象运行时的数据,比如HashCode、锁状态标志、GC分代年龄等。而元数据指针用于指向方法区的中目标类的类型信息,通过元数据指针可以确定对象的具体类型。实例数据:用于存储对象中的各种类型的字段信息(包括从父类继承来的)。对齐填充原创 2021-06-26 22:53:53 · 261 阅读 · 2 评论 -
CopyOnWriterArrayList
CopyOnWriteCopyOnWrite指在“写”的时候,不是直接“写”源数据,而是把数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回。那为什么不直接修改,而是要拷贝一份修改呢?这是为了在“读”的时候不加锁。(以空间换时间的策略)为了提升读取的效率,修改时不在原数据上修改,而是在复制的数组上修改,改完之后再设置回来,这样做就不会阻塞读的线程CopyOnWriteArrayListCopyOnWriteArrayList的核心数据结构也是一个数组,代码如下:public class原创 2021-06-26 22:52:58 · 605 阅读 · 0 评论 -
多线程(五)CAS
简单的实现CAS需求有100个线程同时访问,并且每个线程发起10次请求,最后count次数应该是1000次。public class Demo { //总访问量。volatile保证多线程之间count变量的可见性 private volatile static int count = 0; /** * count ++ 操作实际上是由3步来完成!(jvm执行引擎) * 1.获取count的值,记做A : A=count * 2.将A值+1,得到B :B=A+1 *原创 2021-06-25 23:53:20 · 93 阅读 · 0 评论 -
多线程1~4笔记总结
并发编程三要素原子性:即一个不可再被分割的颗粒。在Java中原子性指的是一个或多个操作要么全部执行成功要么全部执行失败。有序性:程序执行的顺序按照代码的先后顺序执行。(处理器可能会对指令进行重排序)可见性:当多个线程访问同一个变量时,如果其中一个线程对其作了修改,其他线程能立即获 取到最新的值。悲观锁与乐观锁悲观锁:每次操作都会加锁,会造成线程阻塞。乐观锁:每次操作不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止,不会造成线程阻塞。Thre.原创 2021-06-23 15:34:17 · 110 阅读 · 0 评论 -
多线程(四)volatile
1 ⼏个基本概念1.1 内存可⻅性JMM有⼀个主内存,每个线程有⾃⼰私有的⼯作内存,⼯作内存中保存了⼀些变量在主内存的拷⻉。内存可⻅性,指的是线程之间的可⻅性,当⼀个线程修改了共享变量时,另⼀个线程可以读取到这个修改后的值。1.2 重排序为优化程序性能,对原有的指令执⾏顺序进⾏优化重新排序。重排序可能发⽣在多个阶段,⽐如编译重排序、CPU重排序等。1.3 happens-before规则是⼀个给程序员使⽤的规则,只要程序员在写代码的时候遵循happens-before规则,JVM就能保证原创 2021-06-23 10:21:50 · 81 阅读 · 0 评论 -
多线程(三)重排序与happens-before
1 什么是重排序?计算机在执⾏程序时,为了提⾼性能,编译器和处理器常常会对指令做重排。为什么指令重排序可以提⾼性能?简单地说,每⼀个指令都会包含多个步骤,每个步骤可能使⽤不同的硬件。因此,流⽔线技术产⽣了,它的原理是指令1还没有执⾏完,就可以开始执⾏指令2,⽽不⽤等到指令1执⾏结束之后再执⾏指令2,这样就⼤⼤提⾼了效率。但是,流⽔线技术最害怕中断,恢复中断的代价是⽐较⼤的,所以我们要想尽办法不让流⽔线中断。指令重排就是减少中断的⼀种技术。我们分析⼀下下⾯这个代码的执⾏情况:a = b + c;原创 2021-06-23 09:46:46 · 150 阅读 · 0 评论 -
多线程(二)Java内存模型(JVM-JMM)
1 并发编程模型的两个关键问题线程间如何通信?即:线程之间以何种机制来交换信息线程间如何同步?即:线程以何种机制来控制不同线程间操作发⽣的相对顺序有两种并发模型可以解决这两个问题:消息传递并发模型共享内存并发模型这两种模型之间的区别如下表所示:在Java中,使⽤的是共享内存并发模型。2 Java内存模型的抽象结构2.1 运⾏时内存的划分对于每⼀个线程来说,栈都是私有的,⽽堆是共有的。也就是说在栈中的变量(局部变量、⽅法定义参数、异常处理器参数)不会在线程之间共享,也就原创 2021-06-23 08:47:12 · 117 阅读 · 0 评论 -
生产者消费者模型
生产者-消费者模型是一个常见的多线程编程模型,如下图所示:一个内存队列,多个生产者线程往内存队列中放数据;多个消费者线程从内存队列中取数据。要实现这样一个编程模型,需要做下面几件事情:内存队列本身要加锁,才能实现线程安全。阻塞。当内存队列满了,生产者放不进去时,会被阻塞;当内存队列是空的时候,消费者无事可做,会被阻塞。双向通知。消费者被阻塞之后,生产者放入新数据,要notify()消费者;反之,生产者被阻塞之后,消费者消费了数据,要notify()生产者。第1件事情必须要做,第2原创 2021-06-22 10:59:10 · 173 阅读 · 0 评论 -
多线程(一)基础部分
1 进程与线程进程:进程是程序的一次动态执行过程,它经历了从代码加载、执行到执行完毕的一个完整过程,这个过程也是进程本身从产生、发展到消亡的过程进程:正在执行的程序,其实就是应用程序在内存中运行的那片空间线程:是进程中的一个执行单元,负责进程中的程序的运行,一个进程中一定要有线程,而且至少有一个一个进程可以有多个线程,那么这个应用程序可以称为多线程程序线程实际上是在进程基础之上的进一步划分如果一个进程没有了则线程肯定会消失,但是线程消失进程未必会消失并发:可以实现应用多部分程序同时执行所有原创 2021-06-21 18:53:18 · 116 阅读 · 0 评论 -
第二部分:HashMap原理
1.HashMap的继承体系是什么样的?2.Node数据结构分析?3.底层存储结构介绍? 8.HashMap扩容原理?在 JDK 1.7 中 HashMap 是以数组加链表的形式组成的,JDK 1.8 之后新增了红黑树的组成结构,当链表大于 8 并且容量大于 64 时,链表结构会转换成红黑树结构,即使在hashcode 完全相同极端情况下,由于红黑树的特点,查找某个特定元素,也只需要O(log n)的开销,而如果查找链表,时间复杂度会退化到 O(n)。4.put数据原理分析?Hash原创 2021-06-19 14:50:23 · 90 阅读 · 0 评论