JUC02-多线程锁、线程中断机制、LockSupport线程间通信
[TOC] JUC02课程任务概览本部分包含: 多线程锁各种锁的概览 获得锁的流程 线程中断机制 LockSupport的park替换wait和await方法 多线程锁悲观锁和乐观锁 悲观锁 显式的锁定之后再操作同步资源 适合写操作多的场景,先加锁可以保证写操作时数据正确。 synchronized关键字和lock的实现类都是采用悲观锁 乐观锁 认为自己在使用数据时不会有别的线程修改数据或资源,所以不会添加锁。 在Java中是通过使用无锁编程来实现,只是在更新数据的时候去判断,之前有没有别的线程更新了这个数据。 如果这个数据没有被更新,当前线程将自己修改的数据成功写入。 如果这个数据己经被其它线程更新,则根据不同的实现方式执行不同的操作,比如放弃修改、重试抢锁等等 判断规则 1 版本号机制Version 2 最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。 适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。 synchronizedsynchronized 8锁案例演示阿里开发手册: 【强制 ...
JUC01-Future接口、CompletableFuture异步任务、Java8函数式接口和Stream流式编程
[TOC] JUC01课程任务概览本部分包含: 多线程的一些基本概念 Future接口复习 CompletableFuture异步任务 Java8新语法介绍:函数式编程、Chain链式调用、Stream流式编程 多线程的一些概念并发与并行并发(Concurrent): 是在一个实体上的多个事件 是在一台服务器上“同时”处理多个任务 同一时刻,其实是只有一个事件在发生 eg:抢票、秒杀商品 并行(Parallel): 是在不同实体上的多个事件 是在多台处理器上同时处理多个任务 同一时刻,大家真的都在做事情,你做你的,我做我的,但是我们都在做 eg:泡方便面 进程、线程、管程进程(Process): 简单的说,在系统中运行的一个应用程序就是一个进程,每一个进程都有它自己的内存空间和系统资源。 线程(Thread): 也被称为轻量级进程,在同一个进程内会有1个或多个线程,是大多数操作系统进行时序调度的基本单元 **管程/Monitor(监视器)**,也就是我们平时所说的锁 Monitor其实是一种同步机制,他的义务是保证(同一时间)只有一个线程可以访问被保护的数据和代 ...
JUCBase
[TOC] 课程内容概览• 1、什么是 JUC • 2、Lock 接口 • 3、线程间通信 • 4、集合的线程安全 • 5、多线程锁 • 6、Callable 接口 • 7、JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore • 8、读写锁: ReentrantReadWriteLock • 9、阻塞队列 • 10、ThreadPool 线程池 • 11、Fork/Join 框架 • 12、CompletableFuture 该部分只是对JUC体系的大致了解,锁介绍内容偏向于了解和入门应用,更高级部分将在JUC01-08部分详细讲解 另外:JUC01-08部分,没有集合的线程安全、Callable接口、三大辅助类、阻塞队列、线程池、Fork/Join部分的讲解,其他部分均有详细讲解以及更多其他内容的讲解 1 什么是 JUC1.1 JUC 简介在 Java 中,线程部分是一个重点,本篇文章说的 JUC 也是关于线程的。JUC 就是 java.util .concurrent 工具包的简称。这是一个处理线程的工具包,JDK ...
JUC笔记大纲
尚硅谷周阳JUC全程跟做笔记,感谢尚硅谷,感谢周阳老师,看到评论区的别人的笔记我都不太满意,一楼的伙伴分享的笔记我看加入了很多自己的东西,并没有完全按照老师的课程来走,所以我就自己写了一些笔记,包含老师99%的课件以及一部分自己的理解,让老师的课更通俗易懂 目录JUCBase-JUC基础:JUC基础框架体系大致了解JUC01-Future接口、CompletableFuture异步任务、Java8函数式接口和Stream流式编程JUC02-多线程锁、线程中断机制、LockSupport线程间通信JUC03-JMM、volatileJUC04– CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类JUC05-ThreadLocal、ThreadLocal底层与Thead、ThreadLocalMap之间的关系、Java对象内存布局JUC06-无锁、偏向锁、轻量级锁、重量级锁,synchronized锁升级JUC07-AQS(AbstractQueuedSynchronizer)及源码解读JUC08- 读写锁ReentrantReadWriteLock、邮戳锁StampedLoc ...
JVM垃圾回收、垃圾回收算法、垃圾回收器
红线以上部分本博客上传了对应笔记,红线以下部分可前往我的GitHub下载对应文档 链接:https://github.com/spongehah/javaee/tree/main/JVM
JVM类的加载过程
类的加载过程 我们所说的加载完毕包括:加载、链接、初始化三个阶段都完成之后类进入方法区中 加载(Loading):查找编译后该类对应的 .class文件,并对常量进行默认初始化赋值0 链接(Linking): 验证(Verify):验证class文件是否符合当前虚拟机的要求 准备(Prepare):为类变量分配内存并设置默认初始值0,并为常量进行显式赋值 解析(Resolve):将常量池内的符号引用转换为直接引用的过程 初始化(Initialization):执行类构造器 clinit()方法的过程,对类变量初始化赋值 加载(Loading)加载的理解查找编译后该类对应的 .class文件 所谓加载,简而言之就是将)ava类的字节码文件加载到机器内存中,并在内存中构建出]ava类的原型一一类模板对象。所谓类模板对象,其实就是]va类在JVM内存中的一个快照,JVM将从字节码文件中解析出的常量池、类字段、类方法等信息存储到类模板中,这样JVM在运行期便能通过类模板而获取]ava类中的任意信息,能够对]ava类的成员变量进行遍历,也能进行Java方法的调用。 反射的机制即基于 ...
JVM类的加载器
类的加载器环境JDK1.8中,在JDK1.9时,类的加载器会发生一定的变化,但对于学习改变不大 概述ClassLoader的作用类加载器是JVM执行类加载机制的前提。 ClassLoader的作用: ClassLoader是Java的核心组件,所有的Class都是由ClassLoader:进行加载的,ClassLoader负责通过各种方式将Class信息的二进制数据流读入JVM内部,转换为一个与目标类对应的java.lang.Class对象实例。然后交给]ava虚拟机进行链接、初始化等操作。因此,ClassLoader在整个装载阶段,只能影响到类的加载,而无法通过ClassLoader去改变类的链接和初始化行为。至于它是否可以运行,则由Execution Engine决定。 类加载器最早出现在java1.0版本中,那个时候只是单纯地为了满足java Applet.应用而被研发出来。但如今类加载器却在OSGi、字节码加解密领域大放异彩。这主要归功于Java虚拟机的设计者们当初在设计拳加载器的时候,并没有考虑将它绑定在]VM内部,这样做的好处就是能够更加灵活和动态地执行类加载操作。 显式 ...
对象的创建和内存布局和执行引擎
对象的创建和内存布局和执行引擎课程内容概览该部分包含: 对象的创建及对象的内存布局 执行引擎 部分图源自作者youthlql,懒得重新看视频截图了,就在这位作者的笔记基础上和自己原ipad的goodnotes笔记结合做了一定修改 对象的创建和内存布局对象创建的方式 new: 最常见的方式 单例类中调用getInstance的静态类方法 XXXFactory的静态方法 Class的newInstance方法:在JDK9里面被标记为过时的方法,因为只能调用空参构造器,并且权限必须为 public Constructor的newInstance(Xxxx):反射的方式,可以调用空参的,或者带参的构造器 使用clone():不调用任何的构造器,要求当前的类需要实现Cloneable接口中的clone方法 使用序列化:从文件中,从网络中获取一个对象的二进制流,序列化一般用于Socket的网络传输 第三方库 Objenesis 对象创建的步骤 1、判断对象对应的类是否加载、链接、初始化 虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个 ...
运行时数据区(03)方法区、字符串常量池
运行时数据区(03)课程内容概览该部分包含: 方法区 字符串常量池 部分图源自作者youthlql,懒得重新看视频截图了,就在这位作者的笔记基础上和自己原ipad的goodnotes笔记结合做了一定修改 方法区栈、堆、方法区的交互关系从线程共享与否的角度来看 ThreadLocal:如何保证多个线程在并发环境下的安全性?典型场景就是数据库连接管理,以及会话管理。 栈、堆、方法区的交互关系 下面涉及了对象的访问定位 Person 类的 .class 类元信息存放在方法区中 person 变量存放在 Java 栈的局部变量表中 person对象引用指向堆中实例数据(真正存储) 在 person 对象中,有个指针指向方法区中的 person 类元信息(类型指针) 方法区的理解 官方文档:https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-2.html#jvms-2.5.4 方法区在哪里? 《Java虚拟机规范》中明确说明:尽管所有的方法区在逻辑上是属于堆的一部分,但一些简单的实现可能不会选择去进行垃圾收集或者进行压 ...
运行时数据区(02)堆、新生代、老年代
运行时数据区(02)课程内容概览该部分包含: 堆 部分图源自作者youthlql,懒得重新看视频截图了,就在这位作者的笔记基础上和自己原ipad的goodnotes笔记结合做了一定修改 堆堆的核心概述堆与进程 堆针对一个JVM进程来说是唯一的。也就是一个进程只有一个JVM实例,一个JVM实例中就有一个运行时数据区,一个运行时数据区只有一个堆和一个方法区。 但是进程包含多个线程,他们是共享同一堆空间的。 一个JVM实例只存在一个堆内存,堆也是Java内存管理的核心区域。 Java堆区在JVM启动的时候即被创建,其空间大小也就确定了,堆是JVM管理的最大一块内存空间,并且堆内存的大小是可以调节的。 《Java虚拟机规范》规定,堆可以处于物理上不连续的内存空间中,但在逻辑上它应该被视为连续的。 所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,**TLAB**)。 《Java虚拟机规范》中对Java堆的描述是:**所有的对象实例以及数组都应当在运行时分配在堆上**。(The heap is the ...