![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
再看JVM+JUC
文章平均质量分 93
再次系统学习JVM+JUC笔记
苹果香蕉西红柿
这个作者很懒,什么都没留下…
展开
-
@Async 异步调用
策略模式一. @Async 基础基础使用示例二. @Async 与线程池实现AsyncConfigurer 替换默认线程池指定 @Async 使用的线程池一. @Async 基础在编写接口时大多数情况下都是通过同步的方式来实现交互处理,在特殊情况下可能会用到异步处理,例如并不关注执行结果,响应缓慢等等,可以在接口中开启一个子线程通过子线程执行,也可以使用spring 3.x提供的@AsyncSpring3提供了@Async注解,该注解可以被标注在方法上,以便异步地调用该方法,使用前需要@Enable原创 2023-05-15 09:12:52 · 278 阅读 · 0 评论 -
线程池基础与生产环境配置线程池实现步骤
目录一. 线程池基础二. Executors 创建线程池newCachedThreadPool可缓存线程池newFixedThreadPool定长线程池newScheduledThreadPool定长线程池,支持定时及周期性任务执行。延迟执行newSingleThreadExecutor单线程化线程池,使用唯一的工作线程来执行任务保证所有任务按照指定顺序执行线程池调用测试三. 自定义线程池四. 合理配置线程数一. 线程池基础什么是线程池: java通过多线程支持并发处理,在并发操作时会有多个线程创建,原创 2023-05-15 09:12:05 · 543 阅读 · 0 评论 -
JUC 十三. CountDownLatch 与 CyclicBarrier 与 Semaphore 基础使用与底层原理
目录一. CountDownLatch 减少计数器二. CyclicBarrier 循环栅栏三. Semaphore 信号灯四. CountDownLatch 底层实现await() 判断state,也可以简单理解为计数,如果为0获取锁成功,当前线程执行,否则获取锁失败,阻塞当前线程countDown()一. CountDownLatch 减少计数器CountDownLatch 减少计数器,有点像倒计,计数器,当减少为0时线程执行作用是允许1或者多个线程,等待另外N个线程完成某件事情之后,这1个或者原创 2023-05-14 10:17:31 · 58 阅读 · 0 评论 -
JUC 十二. ReentrantReadWriteLock 与 StampedLock
目录一. 基础二. ReentrantReadWriteLock 的锁降级一. 基础ReentrantReadWriteLock 可以看为读读共享,读写,写写依然互斥,总结一句话: 读写互斥,读读共享,既一个资源可以被多个读操作或一个写操作访问了解一下 ReentrantReadWriteLock 中存在的问题: 锁饥饿问题,假设当前有99个读请求进来,后续又进来一个写请求,当时需求上要去,只要有修改,要马上生效,在使用 ReentrantLock 时不区分读写,虽然公平锁解决线程饥饿只是针对执行请原创 2023-05-14 10:16:01 · 79 阅读 · 0 评论 -
JUC 十一. AQS 与 ReentrantLock
目录一. AQS 基础二. AQS 结构了解三. ReentrantLock 基础通过 队列 + Unsafe 自定义一个简单版的锁四. ReentrantLock 源码解读NonfairSync非公平锁获取源码解析lock() 获取锁方法acquire()tryAcquire()尝试获取锁方法addWaiter() 通过当前线程封装Node对象,并入列acquireQueued() 判断Node状态,并阻塞线程FairSync 公平锁获取ReentrantLock 中 lockInterruptibly(原创 2023-05-14 10:15:39 · 67 阅读 · 0 评论 -
JUC 十. synchronized深入
目录一. 基础复习简单解释对象头如何查看对象头二. 根据synchronized修饰不同成员了解synchronized实现原理同步代码块小总结同步方法小总结synchronized 与 管程底层分析三. 锁升级相关四. synchronized 可重入分析总结一. 基础复习synchronized,与 ReentrantLock 都属于悲观锁乐观锁,例如Version,Atomic包下的原子类AtomicInteger 等,基于cas实现乐观锁synchronized 根据编写方式不同分为: 同原创 2023-05-14 10:16:09 · 64 阅读 · 0 评论 -
JUC 九. CompletableFuture
一. CompletableFuture在学习FutureTask时发现调用get()获取任务结果中存在的问题,引出CompletableFutureCompletableFuture 是个类实现了Future接口与CompletionStage两个接口,其中CompletionStage表示异步计算过程中的某一个阶段,一个阶段完成以后可能会触发的另外一个阶段,一个阶段的执行可能是被另外一个阶段完成或多个阶段一起触发的核心静态方法runAsync(): 无输入,无返回值supplyAsy原创 2023-05-14 10:15:46 · 93 阅读 · 0 评论 -
JUC 八. CAS
目录一. 基础解释 JDK 中的 Unsafe解释: AtomicInteger 中 getAndIncrement() 实现累加操作是怎么保证原子性的一. 基础在以前通常使用synchronized,loc等加锁方式在多线程下保证线程安全CAS无锁机制保证线程安全,本质是没有锁,不会阻塞等待compareAndSwapInt,涉及到三个操作数据: 数据所在的内存位置,预期值,新值。数据库cas应用案例: 添加version版本号,更新时以该version版本号为条件,并且同步更新这个versi原创 2023-05-14 10:15:24 · 25 阅读 · 0 评论 -
JUC 七. LockSupport 线程的阻塞与唤醒
目录一. LockSupport 基础二. 阻塞与唤醒线程的集中方式wait() 与 notify() 方式JUC包下 Condition 中的 await() 与 signal() 方式LockSupport 方式一. LockSupport 基础LockSupport是什么: 是用来创建锁和其它同步类的基本线程阻塞原语,LockSupport中有两个方法park() 和unpark()park(): 阻塞线程unpark(): 解除阻塞线程简单来说: LockSupport 类,可以原创 2023-05-14 10:14:06 · 87 阅读 · 0 评论 -
JUC 六. 线程中断 与 LockSupport
目录一. 基础理解如何退出一个线程volatile 与 AtomicBoolean 中断线程示例Thread中自带的中断api示例阻塞状态线程中断时异常解决二. Thread中自带的中断底层分析一. 基础理解先了解几个问题:怎么中断一个运行中的线程多线程中断标识是什么中断后线程是不是就立刻停止运行了注意: 一个线程不应该由其他线程来强制中断或停止,而是应该有线程自己自行停止,所以Thread.stop, Thread.suspend, Thread.resume都已经被废弃每个原创 2023-05-13 23:06:17 · 29 阅读 · 0 评论 -
JUC 五. ThreadLocal 与 四大引用
目录一. 基础使用ThreadLocal存储数据时的几个注意点二 ThreadLocal 源码分析通过 ThreadLocal 的 get() 方法进行源码分析三 通过 ThreadLocal 引出四大引用,与 ThreadLocal 中存在的内存泄漏问题与四大引用一. 基础什么是ThreadLocal: 属于当前线程的线程私有的本地变量,每个线程在通过get(),set()访问ThreadLocal时,都有自己的独立初始化的变量副本你用ThreadLocal实现了什么功能:利用每个线程都有自己原创 2023-05-13 23:05:54 · 35 阅读 · 0 评论 -
JUC 四. volatile 与内存屏障
目录一. volatile 基础二. 内存屏障三. volatile 与内存屏障四. volatile 变量的读写过程通过了解 volatile 的读写过程了解为什么不具备原子性五. 如何正确使用 volatile六. 总结一. volatile 基础前面我看了解了JMM内存模型,内存又分为主内存与本地内存(也就是缓存),线程读数据是主内存的,而修改数据是先修改缓存,然后由缓存刷出到主内存中,假设在刷出前其它线程进来可能读取到老数据,出现脏读等问题volatile 基于JMM"先行发生原则happe原创 2023-05-13 23:05:32 · 330 阅读 · 0 评论 -
JUC 三. JMM内存模型
目录一. 基础二. 多线程的先行发生原则happens-before一. 基础先看几个面试题JMM 与 volatile 之间的关系JMM有哪些特性(什么是JMM三大特性): 原子性,可见性,有序性为什么要有JMM, 主要的作用功能是什么happens-before先行发生原则是什么在CPU上有多级缓存,CPU并不是直接运行在内存中的,而是把内存中的数据读取到缓存中,内存中的数据读写速度不一致会造成数据不一致的问题JMM: java Memory Model 内存模型, ja原创 2023-05-13 23:05:08 · 30 阅读 · 0 评论 -
JUC 二. 对象布局
目录一. 基础对象头实例数据对齐填充jol-core工具证明对象布局与压缩指针一. 基础先了解几个面试题:JUC 层面,说以下AQS大致流程CAS自旋锁,获取不到锁时会一直自旋吗? CAS 与 synchronized区别在哪,为什么CAS好,CAS 自旋时能保证当前自旋的线程一直占用cpu吗,如果cpu放弃了当前这个线程,是不是还要带来线程再次抢占cpu的开销synchronized 底层如何实现,在同步时有没有用到cas,具体在哪里用到了对象头中存储了那些信息,长度是多少Obje原创 2023-05-13 23:05:39 · 36 阅读 · 0 评论 -
JUC 一. 基础
目录线程相关复习java 线程分类线程相关复习什么是进程,什么是线程进程: 程序一次执行, 系统分配和调度的资源单位,每一个进程都有他自己的内存空间和系统资源,一下程序运行需要一个进程线程: 在同一个程序内可以运行一个或多个任务,每个任务我们可以看为是一个线程,也就是一个进程中会有一个或多个线程从操作系统层面去看整体是: 多进程运行,允许多个任务同时指向,每个进程中以多线程方式运行(多核时多线程,单核时通过资源调度纳秒级,实际还是单线程), 允许进程和线程之间共享资源,这样就需要提供协调机制原创 2023-05-13 23:04:22 · 30 阅读 · 0 评论 -
JVM 八. JVM与GC调优
目录一. 基础一. 基础为什么要调优: 防止出现OOM, 减少FullGC垃圾的串行化回收造成的运行慢,卡顿问题原创 2023-05-13 23:03:49 · 61 阅读 · 0 评论 -
JVM 七. GC日志分析 与 内存泄漏 与 OOM案例
目录一. GC 日志分析二. 内存泄漏,溢出导致内存泄漏的八种情况静态相关导致内存泄漏内部类持有外部类导致内存泄漏各种连接资源导致内存泄漏变量不合理的作用域改变哈希值导致内存泄漏缓存导致内存泄漏监听器回调导致内存泄漏三. OOM案例栈溢出堆内存溢出案例元空间溢出案例GC overhead limit exceeded线程溢出一. GC 日志分析生产为了定位GC问题,需要开启GC日志,进行相关配置还有一种生成内存映像文件dump文件,分为手动方式,自动方式两种二. 内存泄漏,溢出什么是内存原创 2023-05-13 23:03:19 · 1459 阅读 · 0 评论 -
JVM 六. 垃圾回收相关
目录一. 基础概述二. 垃圾回收算法判断垃圾阶段引用计数算法可达性分析算法/根搜索算法 GC Roots垃圾标记和清除阶段标记清除算法复制算法(通常用在新生代)标记压缩算法分代算法增量收集算法什么是STW安全点与安全区域三. 垃圾回收器四. 内存泄漏,溢出导致内存泄漏的八种情况静态相关导致内存泄漏内部类持有外部类导致内存泄漏各种连接资源导致内存泄漏变量不合理的作用域改变哈希值导致内存泄漏缓存导致内存泄漏监听器回调导致内存泄漏四. GC日志分析一. 基础概述先了解几个常见面试题:讲一下JVM的GC什原创 2023-05-13 23:02:38 · 66 阅读 · 0 评论 -
JVM 五.执行引擎 与执行引擎中的编译器,解释器
目录一. 执行引擎一. 执行引擎执行引擎是什么: JVM 只是负责装载字节码到其内部,并不能直接运行,通过执行引擎对字节码指令解释编译为对应平台的本地机器指令,简单来说JVM中的执行引擎就是将代码翻译为机器能够识别的机器语言执行引擎是怎么工作的: 执行引擎依赖程序计数器寄存器中的指令,每当执行完一项指令操作后寄存器就会更新下一条需要被执行的指令地址,代码的编译:在java中代码编译有两种将代码编译分为两个阶段: 先将.java文件编译为.class文件,然后使用后端运行期编译器将字节码转换原创 2023-05-13 23:03:03 · 54 阅读 · 0 评论 -
JVM 四. 对象布局
目录一. 对象实例化相关创建对象的步骤二. 对象的内存布局三. 对象的访问定位一. 对象实例化相关有哪些方式可以创建一个对象new 方式创建一个对象,由new方式创建对象又延伸出 Builder建造者方式,Factory工厂方 等静态方法方式Class的newInstance(),反射方式,要求只能调用孔灿构造器,权限必须是publicConstructor的newInstance(),基于反射方式,可以调用空参,带参,并且权限没要求,实用性更广clone()方式,当前类要实现Clone原创 2023-05-12 09:59:15 · 35 阅读 · 0 评论 -
JVM 三. 运行时内存结构详解
目录程序计数器虚拟机栈本地方法接口与本地方法栈堆方法区直接内存StringTable程序计数器虚拟机栈本地方法接口与本地方法栈堆方法区直接内存StringTable原创 2023-05-12 09:58:50 · 52 阅读 · 0 评论 -
JVM 二. 类加载相关
目录一. 类的加载二. 类的加载器类加载器的双亲委派机制一. 类的加载什么是类的加载: 我们编写java代码存储为.java结尾的文件,经过编译器编译,将java代码转换为虚拟机指令生成.class结尾的文件,当需要某个类时,虚拟机加载指定的.calss文件,并创建对应的class对象, 将class文件加载到虚拟机内存的过程称为类的加载,通过ClassLoder 负责将class文件字节码内容加载到内存中,并将这些内容转换成方法区的运行时数据结构,ClassLoder只负责加载,是否可以运行则由 E原创 2023-05-12 09:58:22 · 33 阅读 · 0 评论 -
JVM 一. 字节码与数据类型相关
目录一. 字节码,数据类型相关一. 字节码,数据类型相关字节码文件是跨平台的吗: 是的,java虚拟机主要识别字节码文件,其实现在的java虚拟机已经不是单纯的java的,只要语言满足虚拟机的规范,都可以在这个虚拟机上运行class文件中存储的什么: 代码经过编译后生成的一个字节码文件,是一种二进制的类文件,存储了JVM指令说一下你知道的编译器:在编写好代码到运行中间可以分为两种编译器,一个是用来识别各种语言对语言进行转换的前端编译器例如将代码编译为class文件的javaC编译器,javaC编译原创 2023-05-12 09:58:49 · 47 阅读 · 0 评论 -
ThreadLoacl
目录三. ThreadLoacl 基础二. InheritableThreadLocal三. TransmittableThreadLocal三. ThreadLoacl 基础在Java的多线程编程中,为保证多个线程对共享变量的安全访问,通常会使用synchronized来保证同一时刻只有一个线程对共享变量进行操作。 但在有些情况下,synchronized不能保证多线程对共享变量的正确读写。例如类有一个类变量,该类变量会被多个类方法读写,当多线程操作该类的实例对象时,如果线程对类变量有读取、写入操原创 2020-08-25 18:50:11 · 149 阅读 · 0 评论