JUC-3-多线程锁
悲观锁与乐观锁
悲观锁
他认为自己在使用数据时一定有别的线程来修改数据,因此在获取数据时先加锁,确保数据被别的线程修改。常见的有synchronized关键字和Lock的实现类
应用场景:
适合写操作多的场景,先加锁可以保证写操作时数据正确,显式地锁定后再操作同步资源
乐观锁
他认为自己在使用数据时不会有别地线程修改数据或资源,所以不会添加锁。在Java中是通过使用无锁编程来实现,只是在更新数据时去判断之前有没有其他线程更新这个数据。如果该数据没有更新,当前线程将自己修改的数据成功写入;如果该数据已经被其他线程更新,则根据不同实现方式执行不同的操作
判断规则:
版本号机制(Version)
CAS算法(Java原子类中的递增操作采用CAS自旋实现)
应用场景:
适合读操作多的场景,不加锁的特点使其读操作的性能大幅提升。乐观锁则直接去操作同步资源,是一种无锁算法
案例演示
悲观锁
123public synchronized void m1() { // 加锁后的业务逻辑}
1234567891011// 保证多个线程使用的是同一个lock对象的前 ...
JVM 内存与垃圾回收篇-6-执行引擎
执行引擎概述
执行引擎是Java虚拟机核心的组成部分之一
“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而虚拟机的执行引擎则是由软件自行实现的,因此可以不受物理条件制约地定制指令集与执行引擎的结构体系,能够执行那些不被硬件直接支持的指令集格式。
JVM的主要任务是负责装载字节码到其内部,但字节码并不能够直接运行在操作系统上,因为字节码指令并非等价于本地机器指令,它内部包含的仅仅只是一些能够被JVM所识别的字节码指令、符号表,以及其他辅助信息
执行引擎(Execution Engine)的任务就是将字节码指令解释/编译为对应平台上的本地机器指令
从外观上来看,所有的Java虚拟机的执行引擎输入、输出都是一致的:输入的是字节码二进制流,处理过程是字节码解析执行的等效过程,输出的是执行结果。
执行引擎工作过程
执行引擎在执行的过程中究竟需要执行字节码指令完全依赖于PC寄存器
每当执行完一项指令操作后,PC寄存器就会更新下一条需要被执行的指令地址
当然方法在执行的过程中,执行 ...
JVM 内存与垃圾回收篇-5-直接内存
直接内存不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内容,它是Java堆外的、直接向系统申请的内存区间
来源于NIO,通过存在堆中的DirectByteBuffer操作的Native内存
通常,访问直接内存的速度会优于Java堆。即读写性能高
出于性能考虑,读写频繁的场合可能会考虑使用直接内存
Java的NIo库允许Java程序使用直接内存,用于数据缓冲区
直接内存也可能导致OOM
由于直接内存在Java堆外,因此它的大小不会直接受限于-Xmx指定的最大堆大小,但是系统内存是有限的,Java堆和直接内存的总和依然受限于操作系统能给出的最大内存
缺点
分配回收成本较高
不受JVM内存回收管理
直接内存大小可以通过MaxDirectMemorysize设置
如果不指定,默认与堆的最大值-Xmx参数值一致
JVM 内存与垃圾回收篇-4-对象实例化内存布局与方法定位
对象实例化对象的创建方式
使用new关键字
最常见的方式
Xxx的静态方法
XxxBuilder/XxxFactory的静态方法
Class的newInstance()
反射的方式,只能调用空参的构造器,权限必须是public
Constructor的newInstance(Xxx)
反射的方式,可以调用空参、带参的构造器,权限没有要求
使用clone()
不调用任何构造器,当前类需要实现Cloneable接口,实现clone()
使用反序列化
从文件中、网络中获取一个对象的二进制流
第三方 Objenesis
对象的创建步骤
1.判断对象对应的类是否加载、链接、初始化
虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量地中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载、解析和初始化。(即判断类元信息是否存在)。
如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader+包名+类名为Key进行查找对应的.class文件。
如果没有找到文件,则抛出ClassNotFoundException ...
MySQL高级篇-6-索引的数据结构
WHY 索引索引是存储引擎用于快速找到数据记录的一种数据结构,MySQL进行数据查找时,首先看查询条件是否命中某条索引,符合则通过索引查找相关数据,如果不符合则需要全表扫描,直到找到符合的记录。创建索引目的是减少磁盘I/O次数,加快查询速度
索引及其优缺点 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构
索引是在存储引擎中实现的,因此每种存储引擎的索引不一定完全相同,并且每种索引引擎不一定支持所有索引类型。同时,存储引擎可以定义未每个表的最大索引数和最大索引长度。所有索引引擎支持每个表至少16个索引,总索引长度至少为256字节
优点
提高数据检索的效率,降低 数据库的IO成本
通过创建唯一索引,可以保证数据库表中每一行 数据的唯一性
在实现数据的 参考完整性方面,可以 加速表和表之间的连接,即对于有依赖关系的子表和父表联合查询时, 可以提高查询速度。
在使用分组和排序子句进行数据查询时,可以显著减少查询中分组和排序的时间 ,降低了CPU的消耗
缺点
创建索引和维护索引要耗费时间,并 且随着数据量的增加,所耗费的时 ...









