自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(47)
  • 资源 (3)
  • 收藏
  • 关注

原创 vue CodeMirror 使用setValue存在的问题

CodeMirror setValue

2022-12-23 19:26:15 982

原创 ThreadLocal内存泄漏问题

ThreadLocal是用来存放线程私有的变量的,ThreadLocal主要是用ThreadLocalMap存放变量的,ThreadLocalMap有一个Entry[]数组存放,每个线程Thread都有两个ThreadLocal.ThreadLocalMap变量引用(threadLocals ,inheritableThreadLocals ),Entry是一个弱引用WeakReference<ThreadLocal<?>>。强引用:就是创建一个对象,只要引用还指向堆中的对象

2022-02-15 11:15:19 1152

原创 cas详解和unsafe魔法类·

CAS全程 Compare And Swap,比较并交换,它低层调用的是基于硬件平台的汇编指令,指令叫cmpxchg,低层会判断当前系统是多处理器,如果是则cmpxchg指令会添加lock前缀,如果不是就不加lock前缀,java提供的Unsafe方法就是调用汇编指令封装的。cas操作过程:获取内存中的值,然后拿着旧的预期的值和内存中的值作比较,如果比较相等,再用新的值去替换到内存的值,如果内存的值变化了就替换成功,如果没有成功会做自旋重试进行比较。保证每次只有一个线程能够执行。cas是一种..

2022-02-14 19:18:57 384

原创 ConcurrentHashMap详解

在jdk1.7版本的时候ConcurrentHashMap是一个分段锁,采用segments数组+HashEntry数组+链表底层一个Segments数组,存储一个Segments对象,每个segment是继承ReentrantLock互斥锁,具有加解锁的功能,一个Segments中储存一个Entry数组,存储的每个Entry对象又是一个链表头结点。put的时候:先对key做hash,找到segment数组中的位置index,然后竞争lock锁,如果获取到了锁,那就获取到了segment

2022-02-14 00:30:01 3135

原创 HashMap讲解

实现与map接口,java中用于存储key-value键值对的数据。在jdk1.7及之前版本的hashMap底层使用的是:数组+链表在jdk1.8及以后版本的hashMap底层使用的是:数组+链表+红黑树重要成员变量 DEFAULT_INITIAL_CAPACITY = 1 << 4; Hash表默认初始容量 MAXIMUM_CAPACITY = 1 << 30; 最大Hash表容量 DEFAULT_LOAD_FACTOR = 0....

2022-02-13 17:56:00 598

原创 CyclicBarrier

CyclicBarrier可循环使用的屏障,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行。CyclicBarrier和CountDownLatch的区别CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法进行重置,所以CyclicBarrier可以处理更为复杂的场景。例如,如果计算发生错误,可以重置计数器,并让线程重新执行一次。CyclicBarrier默认

2022-02-12 20:25:34 293

原创 CountDownLatch详解

CountDownLatch用来做多线程的计数器吧,用来等待所有线程执行完,如果没有执行完会已知阻塞,计数器底层也是用的state,用来修改state数量,5个线程就是state=5; CountDownLatch也是实现了一个Sync内部类,调用方法是countDown()和await()方法,有一个线程执行完了就执行countDown(),计数器-1,直到全部线程都执行完毕才会解除阻塞。await阻塞,会把所有线程写入到CLH队列中,进行阻塞park.线程执行完会调用countDown方法,

2022-02-12 19:19:46 438

原创 Semaphore详解

Semaphore信号量,控制访问资源的线程数目,其实也是依赖AQS的state状态,也是用一个内部类Sync去继承AQS。可以用来做限流操作,springcloud hystrix就是用的这个做限流。创建Semaphore初始化信号量数量,其实就是设置state的值,Semaphore不仅实现互斥锁,还能实现共享锁。调用acquire方法去获取信号量,默认是一个,可以传入获取数量,调用tryAcquireShared去自旋获取,用state去相减,减成功了就获取到信号量了,(如果是共享锁,如果减完

2022-02-12 18:55:43 233

原创 ArrayBlockingQueue详解

ArrayBlockingQueue是由数组实现的阻塞队列,是BlockingQueue的实现类。特点:是一个有界的数组,创建的时候传入初始队列大小,底层采用的是ReentrantLock实现阻塞和用condition条件队列每次只能有一个线程读写操作,也就是说生产者和消费者公用一把锁,效率其实一般底层采用数组存储=================================================================Node节点,节点存放pre和next

2022-02-12 18:09:05 3328

原创 BlockingQueue详解

BlockingQueue是并发包提供解决并发生产者消费者的问题的。特点:任意时刻只有一个线程生产或者消费操作,是个阻塞队列。队列类型:无限队列(根据内存大小无限增长)和有限队列(定义了队列长度)队列结构一般用数组或者链表实现,FIFO先进先出特点操作方法:常见的4种实现的阻塞队列ArrayBlockingQueue 数组支持的有界队列LinkedBlockingQueue由链接节点支持的可选有界队列 PriorityBlockingQueue由优先级堆支持..

2022-02-12 16:33:40 494

原创 ReentrantLock执行

ReentrantLock是基于AQS(AbstractQueuedSynchronizer)类实现的同步器框架,ReentrantLock是一个互斥锁,类似于Synchronized同步锁。其实是ReentrantLock一个内部类Sync继承AbstractQueuedSynchronizer类,Sync还定义了两个子类,实现公平锁(FairSync)和非公平锁(NonfairSync) ,用到的设计模式是模板设计模式。ReentrantLock其实是基于自旋锁 、LockSupport、CAS原子

2022-02-11 18:55:45 258

原创 AQS原理

AQS是一个构建锁和同步器的并发框架,是AbstractQueuedSynchronizer的缩写,常见AQS实现的同步器框架有ReentrantLock,Semaphore,Latch,Barrier,BlockingQueue等多种多线程访问共享资源的同步器框架,AQS是一种依赖状态(state)的同步器。AQS具备的五大特性:阻塞等待队列、共享/独占、公平/非公平、可重入、允许中断用AQS构建的同步器框架实现原来都是:1、定义内部类Sync继承AQS类2、将同步器所有调用方法都映射

2022-02-11 17:44:22 737

原创 MESI缓存一致性协议--volatile能够保持可见性原因

volatile关键字,其实是轻量级锁,保证共享变量可见性的原因在于缓存一致性,协议主要是intel的MESI协议。现在的cpu都是多核多级缓存架构的,多个cpu内核可以同时处理数据。主内存:我认为的是堆和方法区工作内存:我认为是栈和cpu的三级缓存JMM模型,我认为是一个多线程工作的规范,规范了多线程操作的数据在主内存和工作内存之间是怎么流转的,是jvm内存中的数据和cpu之间怎么协同工作,屏蔽掉了底层硬件的区别。----------------------------------

2022-02-10 16:36:28 1081 3

原创 Kafka 分区主副本同步数据过程

LEO log end offset 日志末端偏移量,表示下一次数据写入的offset位移值,如果一个分区有三条消息,那么LEO就是3,LEO是从0开始算的;HW 高水位 highWaterMark缩写,控制消费者可读取消息范围,取一个partition分区中ISR中最小的LEO,consumer最多只能消费到HW所在的位置。另外每个replica都有HW,leader和follower各自负责更新自己的HW的状 态。对于leader新写入的消息,consumer不能立刻消费,leader会等待该消息被

2022-02-08 17:26:16 1769

原创 rocketmq dledger主副本消息同步

dledger消息同步采用两阶段方式,第一阶段是uncommitted阶段,第二阶段是committed阶段。基于Raft协议完成了两阶 段的数据同步。。。。leader节点上的dledgerServer收到一条数据后,会标记为uncommitted状态,然后吧这个uncommitted消息发送给follower的dledgerServer组件。follower节点的dledgerServer收到uncommitted消息后,返回一个ack给leader的dledgerServer。等l

2022-02-07 15:10:51 1289

原创 RocketMQ的broker集群模式

1、普通集群模式,主从模式有一个master节点,其他都是slave节点,master响应客户端的请求,并存储消息;slave只同步master节点的消息(同步模式是:同步同步或者异步同步),也会响应部分客户端读请求。master挂了的话,slave节点不会转变为master,也就是会导致集群不可用。2、Dledger集群模式Dledger集群是rocketmq在4.5版本之后引入的高可用集群模式,采用Raft算法来随机选举master节点,master节点在挂掉不可用的时候,slave节点

2022-02-07 14:29:26 2646

原创 什么是TCP全双工、半双工

全双工:客户端在给服务器端发送信息的同时,服务器端也可以给客户端发送信息;半双工:客户端可以给服务端发送信息,服务端也可以给客户端发送信息,但是客户端和服务端不能同时发;TCP是全双工的。。。。...

2022-01-26 16:23:33 5579 1

原创 mysql如何防止sql注入

如果是原生jdbc操作,使用prepareStatement代替代替Statement,因为prepareStatement会预编译处理,参数用?占位符代替。如果是mybatis框架,使用#{参数}设置参数,不要用${参数}

2022-01-26 16:10:57 4918

原创 springmvc执行原理

大概流程:初始化阶段:在HttpServletBean调用init方法初始化,init方法里调用子类FrameworkServlet的initServletBean方法,在调用initWebApplicationContext方法,这个方法调用FrameworkServlet子类DispatcherServlet的onRefresh方法,里面调用initStrategies进行初始化,主要初始化HandleMappings,handleAdapter,viewResolvers等。...

2022-01-23 09:58:23 436

原创 BeanFactory和FactoryBean的区别

BeanFactory是用来生成bean实例的,将beanDefinition实例化成bean,而FactoryBean是一个接口,使用的是工厂模式,实现它的bean类需要重写getObject方法,(可以修改对象类型)。当getBean的时候实际是去调用getObject方法返回bean。...

2022-01-09 01:18:51 174

原创 MSYQL MVCC多版本并发控制机制

mysql在可重复读隔离级别下,如何保证事务较高的隔离性,靠的是MVCC((Multi-Version Concurrency Control)机制来保证的。对一行数据的读和写两个操作默认 是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操 作加锁互斥来实现的。mysql隔离级别(读已提交和可重复读)都实现了MVCC机制。mvcc机制其实是靠undo回滚日志和readview一致性视图来实现的。undo回滚日志版本链是指一行数据被多个

2022-01-05 19:06:49 556

原创 MYSQL表锁,行锁,间隙锁(Gap Lock)

间隙锁,锁的就是两个值之间的空隙。间隙锁只有再可重复读级别下才会生效。Mysql默认级别是可重复读repeatable-read,可重复读存在幻读问题,可以用间隙锁来解决幻读。例如:account表数据存在三个间隙:(3,10),(10,20),(20,正无穷)如果一个事务执行sql:update account set name='aaa' where id>3 and id<18;那么其他事务将无法在间隙范围(3,20]插入数据。这个...

2022-01-05 16:31:45 1300

原创 MYSQL并发事务处理带来的问题

更新丢失(Lost Update)或者脏写当两个或多个事务同时操作同一行数据的时候,然后基于最初选定的值更新该行时,由于每个事务不知道其他事务的存在,会发生丢失更新问题,最后的事务的更新会覆盖其他事务的更新。脏读(Dirty Reads)一个事务对一行数据做修改,在这个事务提交之前,这条记录的数据处于不一致的状态,也就是说修改的数据对其他事务是不可见的;但是,在不加控制的时候,另一个事务就会读取到未提交的数据,也就是脏数据,并对数据进行修改。一句话:事务A读取到了事务B已经修改但尚未..

2022-01-05 16:06:49 548

原创 事务和ACID属性

事务是指一组sql语句组成的逻辑处理单元。ACID是指原子性,一致性,隔离性,持久性。原子性(Atomicity):事务是一个原子操作,是一个不可分割的工作单位,对数据的修改,要么都执行,要么都不执行。一致性(Consistent):在事务开始和完成的时候,数据都要保持一致状态。使得数据从一个一致的状态转换到另一个一致状态。这意味着所有相关的数据规 则都必须应用于事务的修改,以保持数据的完整性。隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的独立环

2022-01-05 15:36:02 509

原创 MYSQL表关联JOIN常见两种算法

1、嵌套循环连接Nested-Loop Join (NLJ)算法。一次一行从一张表(驱动表)中读取行数据,再从这行数据中获取关联字段,根据关联字段再到另一张表(被被驱动表)中取出满足条件的行,然后取出两张表的结果集合。EXPLAIN select * from t1 inner join t2 on t1.a= t2.a;2、 基于块的嵌套循环连接 Block Nested-Loop Join(BNL)算法把驱动表的数据读入到 join_buffer 中,然后扫描被驱动表,把..

2022-01-05 14:49:22 505

原创 mysql count操作效率比较

在innodb引擎中:在字段有索引情况下:count(*)≈count(1)>count(字段)>count(主键id)字段有索引的情况下,其实这四种性能其实都差不多,非要抠细节的话,那就如果上面排名一样了。先说count(主键id),去主键索引树扫描,判断不为null,然后计数加1;但是主键索引树的叶子节点是完整数据,扫描起来会比较慢;count(字段)是扫描二级索引,判断字段是否允许为空,然后计数加1,二级索引的叶子节点是只存了主键字段,那肯定是比完整数据占用空间少,所以co

2022-01-01 17:45:58 1205

原创 MYSQL索引下推

索引下推,全程,索引条件下推(Index Condition Pushdown)简称ICP。SELECT * FROM employees WHERE name like 'LiLei%' AND age = 22 AND position ='manager'创建了索引:idx_name_age_position,联合索引。正常情况(MYSQL5.6之前),这条sql根据最左前缀匹配原则,name会走索引,age和position不一定会走索引。name是like模糊匹配,age和postio

2021-12-30 11:00:09 2657

原创 G1垃圾收集器

G1垃圾收集器(-XX:+UseG1GC)面向服务器的垃圾收集器,主要针对多核服务器和大内存机器,以极高效率的满足gc停顿时间要求,同时具备高吞吐量性能特性。g1将内存区域划分为多个相等大小的独立区域region,最多2048个区域。每个区域的大小,用堆内存和2048相除,也可以使用参数:-XX:G1HeapRegionSize指定区域大小,一般是推荐默认大小。g1默认保留年轻代和老年代概念,但是不再物理隔阂,他们都是可以不连续的区域的集合。默认年轻代占堆内存5%,可以通过“-XX:G.

2021-12-22 18:14:23 334

原创 java垃圾收集器

垃圾收集器是垃圾收集算法的具体实现。根据具体的场景选择适合的垃圾收集器。Serial 收集器 (-XX:+UseSerialGC(年轻代) -XX:+UseSerialOldGC(老年代))Serial (串行)收集器是最早最古老的垃圾收集器。是单线程收集器,就是一个垃圾收集器线程去处理垃圾收集工作。收集垃圾的过程会暂停其他工作线程,(Stop The World)简称STW,知道收集结束。新生代采用复制算法,老年代采用标记-整理算法。优点:简单、高效。单线程执行 没有其他..

2021-12-22 15:29:41 1448

原创 JVM垃圾收集算法

标记-复制算法将内存分为大小相同的两块,每次只使用其中一块。标记存活的对象,当这一块的内存使用完后,将还存活的对象复制到另一块内存去,然后再将使用的内存清理掉。这样每次使用的是内存是一半。标记-清除算法两种方式:1、标记存活的对象,统一回收所有未被标记的对象;(通常是这种情况)2、标记要回收的对象,然后统一回收被标记的对象存在明显的问题:1、效率问题,如果需要标记的对象太多,效率太低。2、空间问题,标记清除后会有大量不连续的碎片空间;标记-整理算法标记..

2021-12-21 16:04:03 49

原创 java对象内存回收

如何判断堆中对象没有被引用需要回收。引用计数法给对象添加一个引用计数器,每当一个地方引用时,计数器加1,当引用失效的时候,计数器减1,当计数器为0的时候表示该对象没有被引用,可以被回收。这个方法简单高效,但是并没有被采用,主要是难以解决对象相互间循环引用问题。比如两个对象A和B,A引用B,B引用A,然后这两个对象没有其他引用,因为A和B相互引用,使得计数器不等于0,无法被垃圾收集器回收。...

2021-12-21 11:22:40 1383

原创 老年代空间分配担保机制

年轻代每次minor gc之前jvm都要计算老年代剩余可用空间。如果老年代剩余可用空间小于年轻代所有对象大小之和(包括垃圾对象)就会看一个"-XX:HandlePromiotionFailure"参数是否设置了,如果有这个参数,就会看老年代可用空间大小,会否大于之前每一次minor gc后进入老年代的对象的平均大小。如果小于或者或者参数没有配置,那就会触发full gc,对老年代和年轻代一起回收一次垃圾。如果回收完还是没有足够的空间存放对象就会发生oom。当然,如果minor gc之后剩余.

2021-12-21 10:24:36 430

原创 逃逸分析和标量替换

逃逸分析 用来确认对象是否被引用,如果不会逃逸(就是没有被引用),可以将该对象在栈上进行分配内存,让对象所在内存随着栈帧出栈而销毁,减轻垃圾回收的压力,减少临时对象在堆上分配内存。例如:开启逃逸分析参数-XX:+DoEscapeAnalysis,JDK7后默认开启逃逸分析,关闭把+改成-使用标量替换优先分配在栈上。标量替换通过逃逸分析确认对象不会逃逸后 ,将对象进一步分解成多个标量,将这些标量分配到栈上或者寄存器上分配内存空间,这样不会因为没有一大块连续空间导致对象内存不够...

2021-12-17 17:30:21 461

原创 双亲委派机制

类加载其实就是双亲委派机制,加载某个类的时候会先委托父类加载器寻找目标,找不到在委托到上层父类加载器,如果所有父类加载器都没有找到目标类,则在自己的类加载路径查找目标类。双亲委派机制简单点说,先找父类加载,找不到再从子类加载。源码中,调用loadClass方法的时候会先判断目标类是否已经加载过了,如果加载过就无需重复加载,直接返回,如果没有,去判断parent不为空,调用parent.loadClass方法,如果parent为空,则调用findBootstrapClassOrNull方法,有引导

2021-12-15 11:21:40 299

原创 类加载器初始化过程

类加载器类别:引导类加载器:BootStrapLoader 负责加载支撑JVM运行的位于JRE的lib目录下的核心类库,比如 rt.jar、charsets.jar等扩展类加载器:ExtClassLoader 负责加载支撑JVM运行的位于JRE的lib目录下的ext扩展目录中的JAR 类包应用程序加载器:AppClassLoader 负责加载ClassPath路径下的类包,加载自己写的那些类自定义加载器:负责加载自己自定义路径下面的类包类加载器初始化过程:执行java.ex.

2021-12-15 10:53:46 387

原创 java loadClass 类加载过程

加载--验证--准备--解析--初始化--使用--卸载加载:从硬盘中io获取到字节码文件,使用的类时才会进行加载,例如调用类的main方法,new对象等等,在加载阶段会在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。验证:校验字节码文件是否正确。准备:给类的静态变量分配内存,并赋值初始值。比如int a=6,初始值是0;解析:将符号引用替换成直接引用,该阶段会把一些静态方法(符号引用,比如 main()方法)替换为指向数据所存内存的指针或

2021-12-14 17:30:53 450

原创 nacos集群脑裂问题解决

脑裂问题通常是发生在节点间不能通信情况下,集群可能会分裂出多个leader的小集群。如何避免脑裂问题,nacos和zookeeper都是在leader选举的时候,需要半数投票通过才能选举成为leader;公式:节点投票数>总节点数/2集群采用奇数节点是因为奇数个最高效和节省资源。...

2021-12-11 16:50:42 3410

原创 nacos集群 raft协议下数据同步原理(cp模式)

nacos集群在选举之后,其他节点需要从leader节点同步数据,leader会在心跳间隔时间的时候会给其他节点发送数据,心跳间隔大概几百毫秒。如果客户端发来数据,nacos集群两阶段提交;首先客户端发送的请求需要转交给leader处理,leader第一步将数据写入到log日志中,然后发送数据给从节点,从节点收到数据后,也存入log日志,然后发送ack给leader确认已经写入日志,然后leader再往自己本地缓存写一份,然后发送commit提交请求给从节点,从节点收到leader消息后也会写入缓存然后

2021-12-11 16:23:50 2995

原创 nacos集群 raft协议下选举原理(cp模式)

nacos集群节点每个节点都有随机休眠时间,此时每个节点都是follower角色,谁先休眠结束唤醒来,谁先发起选举投票,此时该节点会更改乘candidate(候选者,选举者)角色,发起投票的会先给自己发送一票,然后发送投票给其他节点,其他节点还在如果还在休眠中,则会默认认可发起者为leader,则会返回投票个给发起者,根据选举半数原则,达到投票半数以上,此时发起者会变成leader;如果发起投票的时候,其他节点也休眠唤醒了,也会发起投票给其他节点,相当于两个节点同时在发起投票,这种情况的选举无效,需要重新休

2021-12-11 16:05:12 1523

原创 cap原则和base原则

cap原则c: consistency 一致性a: availability 可用性p:partition tolerance 分区容错性base原则:ba:基本可用s: 软可用e:最终一致性cap原则是三选二 ,base原则是cap原则的折中,分布式中优先保证p,然后在c和a中做选择。p是分区容错性,主要是在多节点的部署的系统中,多节点部署在不同的网络分区里,由于网络原因会导致多节点之间无法同步数据,容错是指即使是分区了也要保证系统的可用性。nac...

2021-12-11 13:48:00 937

apache-maven-3.2.5.zip 下载

maven 3.2.5版本,啊。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

2018-01-15

springmvc+spring+shiro+cas单点登录实例

spring+springmvc+shiro+cas单点登录实例 springmvc+spring+shiro+cas单点登录实例 加入了登录验证码认证,修改了下首页样式,不过样式没有弄好,很丑的,有空自己再弄下 说明:cas-server是单点登录服务端,用的是maven项目,但是WEB-INF里面的lib目录下面有很多jar包需要导入到工程。服务端启动就用windows版本的tomcat吧,tomcat添加cas-server就好,端口自定 spring-node-1 和spring-node-1 是cas客户端,这两个直接用maven-tomcat7的插件启动,在pom.xml中配置好了,端口也在配置了。然后clean install tomcat7:run 就能跑起来,注意要修改node1和node2里的shiro.properties配置文件,要配置登录成功成功返回的路径 我的访问的分别是: 服务端: http://localhost:8050/cas-server 客户端:http://127.0.0.1:8081/node1/shiro-cas http://127.0.0.1:8082/node2/shiro-cas 下载地址 github :https://github.com/xiaofeifeia/spring-springmvc-shiro-cas-.git

2018-01-11

可用的fastdfs_client.jar(教你怎么打包成jar包)

根据https://github.com/happyfish100/fastdfs-client-java,用maven安装打包的fastdfs_client.jar,授人以鱼不如授人以渔.....

2017-10-26

空空如也

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

TA关注的人

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