自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 Volatile内存屏障

内存屏障四种类型:1.1、Load指令和Store指令Load指令(读屏障):将内存的数据拷贝到处理器缓存Store指令(写屏障):让当前线程写入缓存的数据可以被其他线程看见1.2、LoadLoad Barriers排队,当第一个读屏障指令读取数据完毕之后,后一个读屏障指令才能够进行加载读取(禁止读和读的重排序)1.3、StoreStore Barriers当A写屏障指令写完之后且保证A的的写入可以被其他处理器看见,再进行B的写入操作(禁止写与写的重排序)1.4、LoadStore Ba

2022-04-24 22:47:35 2442

原创 集合的快速失败(fail-fast)

fail-fast(识别并发、报告异常):基于Java集合(Collection)的一种错误检测机制,当一个线程对某个集合进行操作时,别的线程会因为该机制无法修改集合的结构。(fail-fast)ConcurrentModificationException:集合修改失败(并发修改异常)。当A线程对集合进行结构修改(add、remove、clear)时,会修改集合的modCount(mod数量)。如果此时B线程进入修改集合,在next和remove迭代时,将会判断modCount是否相等,如果不相等,

2022-04-18 00:21:07 419

原创 JVM双亲委派

JVM双亲委派机制:类加载:类加载时线程互斥,所以可以通过内部类进行创建类加载原理:向上加载向下委派当类进行加载时,会寻找他的父类(递归),寻找到最高的父类时向下委派加载,直到不可向下委派为止。约基础的类由约上层的加载器进行加载,但是如果基础类有调用回用户类->线程上下文类加载器1、防止类重复加载无意义消耗资源。2、防止核心类被用户类篡改加载。双亲委派机制三次破坏:第一次:版本问题,双亲委派机制在JDK1.2引入。但类加载器和抽象类CLassLoader在JDK1.0就已经存在,面

2022-04-11 13:22:47 397

原创 JVM加载

加载:预加载:当系统被启用时直接加载需要的资源到内存中懒加载:双重检查锁,通过双重判断进行检查是否需要创建实例,如果实例是null,第二次检查为同步锁->原因:当前实例是null,而在JVM中new和赋值是异步行为类加载器:类加载器:通过一个类的全限定名(绝对路径)来获取这个类的二进制字节流类加载器作用:将编译后的class文件加载到内存中类加载器分类:启动类加载器:加载java的基础类,但由于涉及虚拟机本地实现细节(属于虚拟机实现的一部分),所以不允许被直接引用URL[] urls

2022-04-11 13:22:15 102

原创 Java类加载器

类加载器:类加载器:通过一个类的全限定名(绝对路径)来获取这个类的二进制字节流类加载器作用:将编译后的class文件加载到内存中类加载器分类:启动类加载器:加载java的基础类,但由于涉及虚拟机本地实现细节(属于虚拟机实现的一部分),所以不允许被直接引用URL[] urls = sun.misc.Launcher.getBootstrapClassPath().getURLs();扩展类加载器:加载jre/lib/ext扩展的jar包,可以直接被使用URL[] urls = ((URLClas

2022-04-04 01:52:00 456

原创 Java类加载

加载:预加载:当系统被启用时直接加载需要的资源到内存中懒加载:双重检查锁,通过双重判断进行检查是否需要创建实例,如果实例是null,第二次检查为同步锁->原因:当前实例是null,而在JVM中new和赋值是异步行为类记载过程:装载(Load)通过全限定名获取类的字节流,将字节流转换为方法区运行的数据结构,再通过JVM堆生成class对象去访问数据链接(Link)文件格式验证:class文件格式元数据验证:Java代码规范字节码验证:字节码语义符号引用验证:解析正常执行初始化(In

2022-04-04 01:51:26 763

原创 mysql-checkpoint

checkpoint:缩短数据库的恢复时间缓存空间不够用时,将脏页刷新到磁盘(重做)缓存日志不可用时,刷新脏页sharp checkpoint:完全检查点,数据库正常关闭则将脏页全部写入磁盘uzzy checkpoint:模糊检查点,数据库运行时将脏页部分写入磁盘部分写入:1、master thread checkpoint按照1s/10s时间写入一定比例的脏页到磁盘2、flush_lru_list checkpoint检查LRU(热点数据列表算法)列表是否有足够的空闲页数支撑用户查询,

2022-03-28 01:35:59 916

原创 valatile

valatile:保证变量的内存可见性禁止指令重排序内存可见性:当A线程改变某个变量的值时,其他线程读取时是最新的值总线嗅探机制:基于主内存的处理器,当变量的地址值被改变时,重新从主内存读取内存地址到线程中,保证在线程中的变量可见性问题:虽然valatile保证了线程变量的可见性,但在修改时依然是线程不安全的(读->写)。可以加锁或者使用原子类处理(AtomicInteger)指令重排序:步骤:例如:B需要使用A的值,那么B一定排在A后面。基于内存可见性,让线程中的变量也会基于这一点

2022-03-28 00:57:49 240

原创 多路IO模型

IO操作:将数据从硬盘空间加载到操作系统缓存区->比如JVM内存空间,再将内存空间的数据拷贝到内存地址,然后调用输入/输出IO类型:同步阻塞:读取时无数据则挂起,直到有数据后被主动调用同步非阻塞:一直轮询,每次读取时直接返回错误或者资源不可用,反复调用直到成功IO驱动:给一个注册回调机制,当内核数据就绪时向进行发送一个信号,然后进行IO处理多路复用:初始链接时,加入一个选择器(selector)对数据批量进行监听,当有数据就绪时直接返回状态,再让进程进行处理异步IO:进程发起时带有内核传递

2022-03-27 23:33:54 67

原创 redis持久化

数据持久化:RDB:将数据按照一定时间内修改数据的次数将数据快照保存到磁盘中。可以修改策略使保存策略修改为:每次有数据修改保存、每秒保存、不保存三种情况AOF:记录每次redis操作的语句,但由于操作次数较多,所以记录的数据文件相对较大,并且由于AOF的持久化会重新执行AOF记录的语句,所以同步时间相对较长一般采用RDB+AOF的方式进行数据存储延时双删:当数据需要与数据库保持同步时可以采用延时双删策略,即先删redis数据再修改数据库数据,延迟时间确保数据成功修改,再次删除redis缓存数据以此来

2022-03-14 00:13:23 332

原创 redis数据结构

五种数据类型:string、map、list、set、zset数据结构SDS:基于C语言构建的简单动态字符串,定义了字符串的长度、数量和字节数组。当需要进行插入时可以直接判断len长度,如果长度不够则会进行扩展。而由于SDS定义了len长度和free数量,所以可以进行空间预分配时扩容的长度会比实际长度多,可以避免多次扩展;同样,在缩短字符时可以通过记录数量进行后续使用。并且SDS是通过二进制存储数据,且保留了c语言字符串null字符串结尾的习惯,即可以使用部分c语言的字符串函数链表:定义了len来获取

2022-03-14 00:11:28 2155

原创 mysql事务隔离

mysql事务隔离级别:可重复读rr:mysql默认事务隔离级别,从事务开启时读取的数据进行快照,在数据未被其他事务提交更改时,每次读取的数据都是一样的读已提交rc:只能读取到已经提交的事务读未提交ru:可以读取到其他事务未提交的修改数据串行化:有且只能有一个事务访问数据库MVCC多并发版本控制:数据库会记录当前数据的最后一次的事务id、最后记录的修改日志、隐式自增主键和读视图,当多个事务进入修改时数据库会通过日志查找最大事务id+1,来执行下一次的事务。...

2022-03-07 01:19:42 190

原创 mysql读取问题

脏读:当在未提交的情况下,事务读取到尚未提交的修改数据,此时前一个事务提交失败进行了回滚操作,那么该事务读取到i的数据称之为脏数据,此次读取称之为脏读幻读、不可重复读:没有对读取进行快照处理,同一个事务中会因为另一个事务的修改而造成两次读取的数据不一样。幻读产生于另一个事务的insert操作,不可重复读产生于delete、update操作第一类丢失更新:当A事务先读取到数据,在做业务处理时,B事务对数据进行了更改并提交,然后A事务被回滚了,数据回到了A事务读取之前,此时会丢失B事务的更改操作。即第一类

2022-03-07 01:14:50 243

原创 mysql事务隔离级别

可重复读rr:mysql默认事务隔离级别,从事务开启时读取的数据进行快照,在数据未被其他事务提交更改时,每次读取的数据都是一样的读已提交rc:只能读取到已经提交的事务读未提交ru:可以读取到其他事务未提交的修改数据串行化:有且只能有一个事务访问数据库MVCC多并发版本控制:数据库会记录当前数据的最后一次的事务id、最后记录的修改日志、隐式自增主键和读视图,当多个事务进入修改时数据库会通过日志查找最大事务id+1,来执行下一次的事务。...

2022-03-07 00:58:59 359

原创 mysql锁

一、mysql锁类型行锁、表锁、共享锁、排他(独享)锁表锁:对整张表进行加锁,当表被加锁时,整张表不可被修改;1、由于是整张表加锁,所以该锁颗粒较大更容易产生加锁冲突;2、因为不需要通过索引定位到对应的数据,所以加锁的速度更快;3、因为表锁一次性锁住了整张表,所以相对来说并发更低备注:当手动锁定整张表时,需要同时锁定表的所有别名,否则会报错查看表锁的使用情况:show status like ‘table%’;行锁:对表中的行数据进行加锁,当行数据被加锁时,同样不可被修改;1、因为是行级

2022-03-07 00:50:25 332

原创 线程-线程池

线程池介绍:开辟一片内存空间管理尚未死亡的线程,通过线程池进行线程调度线程池类型:固定尺寸的线程池:固定了线程数量,加入线程数超过最大线程池最大线程数时,进入该线程池需要等待单任务线程池:线程池只持有一个线程,后续线程进入线程池需要等待,使用无界队列进行管理ps:无界队列:底层采用CAS自选进行队列管理,系统资源耗尽前没有空间上限可变尺寸连接池:线程池尺寸不定,没有大小限制延迟连接池:可以使线程进行延迟启动或者定期启动单任务延迟连接池:单线程延迟启动自定义线程池:自定义线程

2022-02-27 21:03:50 113

原创 线程基础篇

线程组成:一个指向当前被执行指令的指令指针:IP寄存器,指向对应线程一个栈:对线程的一个快照存储,记录了所有线程的运行状态,包括调用堆栈,锁池情况等一个寄存器值的集合:定义了一部分描述正在执行线程的处理器状态的值一个私有的数据区:该线程私有的数据线程启动:通过实现 Runnable 接口:由于是实现接口,所以可以继承其他线程,多线程可以共用同一个对象,将cpu代码和对象分开,模型清晰。需要访问当前线程,必须使用Thread.currentThread()方法。通过继承 Thread 类本身

2022-02-27 20:40:32 87

原创 Java锁同步synchronized

synchronized同步的位置:1、普通同步方法,锁是当前实例对象;2、静态同步方法,锁是当前类的class对象;3、同步方法块,锁是括号里面的对象。synchronized存于Java对象头中虚拟机的对象头主要包括两部分数据:Mark Word(标记字段)、Klass Pointer(类型指针)。Mark Word:存储对象自身的运行时数据例如:哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳等等当Java对象头的Mark Word发生锁

2022-02-13 19:19:41 313

原创 Java锁升级

锁状态:无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态线程锁:通常线程锁都是为了保证多个线程抢占同一个资源时不发生问题的一种保障措施,以保证不会发生死锁。锁升级:无锁态:没有对资源进行加锁操作偏向锁:如果同一个线程获取多次同一个锁,则升级为偏向锁,偏向锁会判断线程的id和资源对象的头线程id是否一致,如果一致则直接把锁交予该线程轻量级锁:如果多个线程获取锁,则升级为轻量级锁cas,通过自旋获取锁,如果失败则直接进入到下一次循环再次获取无需等待重量级锁:同步锁,当前只允许一个线程获取锁,进行资

2022-02-13 18:26:18 233

原创 Java锁类型

Java锁类型悲观锁、乐观锁悲观锁:每次进行操作时都默认数据会被更改,对数据进行上排他锁,除了当前操作,其他线程不可访问乐观锁:一般通过其他数据是否有被更高来确定当前数据是否未被更改,比如版本号或者时间戳,通常依赖数据库进行判断处理自旋锁;通过判断当前数据的内存位置的值和预期值进行比对,如果比对通过则修改当前数据的值。在多线程下,其他自旋锁并不会进入等待,而是直接失败进行下一次循环判断。但是如果长时间比对失败,可能会由于自旋锁尝试次数过多导致cpu负荷过大。ABA问题:当某一个数据有A到B,再由B到

2022-02-13 17:48:50 174

原创 HashMap的get/put

HashMap结构JDK1.7及之前:数组+链表JDK1.8:数组+链表+红黑树数组+链表当数据通过put()方法插入时会通过hash散列算法计算得出固定长度的数组下标——>int hash = hash(key);如果该数组下标对应的数据是null,则直接插入。如果有数值——>1.7:头插法,通过改变头部节点的上节点指向1.8:尾插法,通过改变尾部节点的下节点指向由于HashMap属于线程不安全结构,那么如果多线程插入时扩容产生元素迁移则会导致原来a->b的指向,

2022-01-30 14:46:39 1611

原创 Map扩容

扩容:HashMap负载因子0.75,默认容量16当HashMap底层数据结构链表长度超过8数组长度不超过64时,且元素超过16*0.75=12时,进行扩容,每次扩容容量为之前的2次幂。1.7:先扩容、后赋值,通过计算hash赋值到新的HashMap中1.8:直接使用旧hash或索引+旧容量大小...

2022-01-30 14:46:09 3280

原创 hashMap线程安全

线程安全问题:1、因为如果两个线程同时进行插入操作,当A线程在通过hash碰撞的判断之后,此时进入到B线程进行了插入操作,当B线程执行完毕后由于A线程已经进行过hash碰撞判断所以可能会导致A线程数据将B线程数据覆盖。2、当多线程同时检测到map数组需要进行扩容操作时,多条线程会同时进行数组扩容hash计算,但最终只会有一个线程会把扩容后的数组返回给map,但是由于多线程在计算过程中每个hash会更改,则会导致死循环需要线程安全的map则选用hashTableMap(get、put是同步的,同时只能有

2022-01-30 14:45:29 1310

原创 SpringBoot图片上传

//图片存储@RequestMapping("/upload")public JSONObject upload(InputStream dataStream) {//上面是Linux的目标路径,下面是本机//String targetDir = “/image”;// String tempFilePath = “域名” + targetDir;String tempFilePath = “D:/img”;SimpleDateFormat sdf = new SimpleDa

2020-06-08 11:37:06 173

原创 Nginx的负载均衡配置

正常请求:客户端(发送请求)——》服务器(接收请求并获取数据)——》数据库(获取数据给服务器)——》服务器(拿到数据返回到客户端)——》客户端(接收数据前端显示);负载均衡原理:客户端(发送请求)——》服务器(nginx)(接收请求转发给服务器)——》服务器A(接收请求并获取数据)——》数据库(获取数据给服务器)——》服务器A(拿到数据返回到客户端)——》客户端(接收数据前端显示);理解:负...

2020-04-23 18:01:04 122

转载 Springboot项目Shiro整合ajax302跨域问题

Shiro处理ajax跨域问题A页面的ajax向后台请求发送后,Shiro会处理请求并重定向(authc,默认过滤器),此时后端向前端return数据时会发送到B页面上(即Shiro重定向页面)。A页面无法接收到返回数据则不会进行跳转(未响应)ps:一个域名的js在未经允许不得读取另一个域名的内容。但不阻止你向另一个域名发送请求解决方案此时将FormAuthenticationFilter...

2020-02-22 17:23:29 995 5

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除