JDK
文章平均质量分 79
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 · 355 阅读 · 0 评论 -
Java 并发编程三篇 -(线程池)
Java 并发编程下篇 -(线程池)并发编程已完结,章节如下:Java 并发编程上篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)Java 并发编程中篇 -(JMM、CAS 原理、Volatile 原理)Java 并发编程下篇 -(线程池)Java 并发编程下篇 -(JUC、AQS 源码、ReentrantLock 源码)七、共享模型之工具1、线程池池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思原创 2021-07-11 19:40:44 · 151 阅读 · 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 · 142 阅读 · 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 · 254 阅读 · 0 评论 -
Java 并发编程一篇 -(Synchronized 原理、LockSupport 原理、ReentrantLock 原理)
一、基本概念1、进程与线程进程程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至 CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理 IO 的。当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程。进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器 等),也有的程序只能启动一个实例进程(例如网易云音乐、360 安全卫士等)线程一个进程之内可以分为一到多个线程原创 2021-06-29 21:01:29 · 442 阅读 · 0 评论 -
多线程(六)LongAdder源码
1 LongAdder结构分析1.1 为什么要有LongAdderAutomicLong底层使用了CAS操作来控制并发的。在并发量级比较小的情况下,线程冲突的概率比较小,自旋次数少。但是,高并发的情况下,多个线程同时进行自旋操作,就会出现大量失败并一直自旋的情况,这个时候AutomicLong的性能就下降了。所以引入了LongAdder,解决高并发环境下AtomicLong自旋瓶颈的问题。1.2 Longadder的结构其结构如下,当线程不存在竞争的时候,首先将值写入到base中,当线程之间有竞争时原创 2021-06-28 00:04:52 · 193 阅读 · 0 评论 -
Java的对象模型
原文链接对象在堆内存的布局分为三个区域:分别是对象头(Header)、实例数据(Instance Data)、对齐填充(Padding)对象头:对象头包括两部分信息分别是Mark World(_mark)和元数据(_metadata),Mark World用于存储对象运行时的数据,比如HashCode、锁状态标志、GC分代年龄等。而元数据指针用于指向方法区的中目标类的类型信息,通过元数据指针可以确定对象的具体类型。实例数据:用于存储对象中的各种类型的字段信息(包括从父类继承来的)。对齐填充原创 2021-06-26 22:53:53 · 275 阅读 · 2 评论 -
CopyOnWriterArrayList
CopyOnWriteCopyOnWrite指在“写”的时候,不是直接“写”源数据,而是把数据拷贝一份进行修改,再通过悲观锁或者乐观锁的方式写回。那为什么不直接修改,而是要拷贝一份修改呢?这是为了在“读”的时候不加锁。(以空间换时间的策略)为了提升读取的效率,修改时不在原数据上修改,而是在复制的数组上修改,改完之后再设置回来,这样做就不会阻塞读的线程CopyOnWriteArrayListCopyOnWriteArrayList的核心数据结构也是一个数组,代码如下:public class原创 2021-06-26 22:52:58 · 635 阅读 · 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 · 99 阅读 · 0 评论 -
JDK基础答疑
试想,当你的项目启动起来后,你在浏览器地址栏输入一个url地址,随后一个页面出现。请问,这个过程都发生了什么事情?首先访问一个网址,比如www.baidu.com,第一步是域名解析,会先从本地缓存找服务器,找不到会请求到DNS服务器去找。找到对应的ip服务器后,三次握手,与目标主机建立TCP连接动静分离处理:如果是静态资源请求,直接由Nginx处理;如果涉及到动态数据或ajax请求,通过Nginx或其他服务器请求到后端(反向代理+负载均衡)到后端服务器(通常是Tomcat)处理解析请求,用户发送请原创 2021-06-25 22:06:00 · 86 阅读 · 0 评论 -
生产者消费者模型
生产者-消费者模型是一个常见的多线程编程模型,如下图所示:一个内存队列,多个生产者线程往内存队列中放数据;多个消费者线程从内存队列中取数据。要实现这样一个编程模型,需要做下面几件事情:内存队列本身要加锁,才能实现线程安全。阻塞。当内存队列满了,生产者放不进去时,会被阻塞;当内存队列是空的时候,消费者无事可做,会被阻塞。双向通知。消费者被阻塞之后,生产者放入新数据,要notify()消费者;反之,生产者被阻塞之后,消费者消费了数据,要notify()生产者。第1件事情必须要做,第2原创 2021-06-22 10:59:10 · 179 阅读 · 0 评论 -
浅显理解 hashcode 和 hash 算法
HashCodehashcode源码public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31 * h + val[i]; } hash = h;原创 2021-06-20 17:19:06 · 181 阅读 · 0 评论