
Java
文章平均质量分 58
拉通对齐端到端
这个作者很懒,什么都没留下…
展开
-
分布式事务
分布式事务包含两个方面: 一是数据库层面,主要包含XA协议的相关实现,2PC与3PC,像Mysql、Oracle都实现了XA协议,支持分布式事务;因为XA事务有天然的缺陷,无法解决,而且会降低写的性能,所以一般数据库不会使用XA事务,而是采用主备复制、读写分离和分表分库等手段来提供性能瓶颈; 二是业务层面的分布式事务,对多个系统或微服务进行一组原子操作,要么一起成功,要么一起失败,主要的方法有TCC柔性事务、本地消息表、最大努力通知等; 2PC 2pc也叫两阶段提交,是一种同步阻塞协议,也是一种强一致原创 2021-07-09 16:47:35 · 242 阅读 · 0 评论 -
Spring AOP及原理
面向切面编程: 是对面向对象的一种补充,将对多个对象产生影响的公共行为和逻辑,抽取出来并封装成一个可复用的模块,使代码更好维护,符合开闭原则。 例如: 日志打印、权限校验、国际化…… 关键概念: Aspect:切面; JoinPoint:连接点,进行切入的位置; Advice:切面在连接点的操作,包括Around、Before、After等; 实现原理: 静态代理:AspectJ就是静态代理,在编译器就生成代理类,织入到Java对象的字节码里,这种方式性能更好; 动态代理:Spr原创 2021-07-09 16:47:23 · 156 阅读 · 0 评论 -
Spring事务传播
Spring的事务通过注解来实现,注解本身都是一种代理模式; 事务传播机制,主要解决在spring中事务嵌套的问题; PROPAGATION_REQUIRED(默认): 如果存在事务,则加入当前事务,如果没有事务,则开启一个新事务; 如果A调用B,B抛了异常,但是A把B try/catch起来了,那A一样回滚,因为B已经加入A的事务,B抛了异常,整个事务就失败了; PROPAGATION_REQUIREDS_NEW: 无论当前存不存在事务,都开启一个新的事务; PROPAGA原创 2021-07-09 16:46:23 · 110 阅读 · 0 评论 -
Spring Bean作用域与声明周期
Bean的作用域 Singleton:默认作用域,单例模式,每个容器只有一个Bean实例; Prototype:原型模式,每次都产生一个新的bean; Request:为每一个请求新建一个bean,请求结束即销毁; Session:同一个session会话共享一个bean; Global-session:所有会话共享一个bean实例; Bean的生命周期 总体流程: 实例化 ——> 初始化 ——> 使用 ——> 销毁; 细化流程: 实例化Bean:通过BeanDefi原创 2021-07-09 16:46:13 · 108 阅读 · 0 评论 -
Spring IOC及原理
1、IOC: 控制反转,借助第三方(IOC容器)来实现相互依赖的对象之间的解耦,使代码与架构的可维护性变强。 原理:反射编程,可以根据类名来动态的生成对象,但是反射的速度要比正常生成对象慢; 2、DI: 依赖注入,是实现IOC的一种方式; 3、例子: 人是一个对象,杯子也是一个对象,人去握杯子是一个行为,这个行为如果属于人的话,人在实现握这个动作时就需要去依赖杯子的抽象类,这显然不符合常识,难道杯子应该早于人来定义吗?所以杯子应该是被握住,应该将控制权反转,应该是杯子去实现一个HoldAble的原创 2021-07-09 16:45:37 · 133 阅读 · 0 评论 -
JAVA中的NIO、BIO、AIO
IO主要包括:TCP、UDP、文件IO; 以下模型中的非阻塞、多路复用和异步只针对网络IO,和文件IO无关; UNIX五种IO模型 1、阻塞式IO模型 应用进程发送IO系统调用(recvfrom),然后等待数据到达,直到数据到达才返回,不然就一直处于等待状态; 2、非阻塞式IO模型 应用进程发起IO系统调用,如果没有数据,也不会阻塞应用进程,而是告诉应用进程晚点再来,然后应用进程一直轮询,直到返回数据; 3、IO复用模型 使用select或者是epoll这种函数来代替IO系统调用,s原创 2021-07-08 14:49:43 · 90 阅读 · 0 评论 -
JAVA垃圾回收
垃圾对象分析: 引用计数法: 每个对象添加一个引用计数器,每次被引用,计数器+1,失去引用,计数器-1,计数器为0,就应该对象可以被回收了; 没法解决循环引用的问题; 可达性分析法: 从GC Root节点开始,遍历整条引用链,寻找存活节点,回收剩余的对象; 可以作为GC Root节点的对象有: 虚拟机栈中的reference对象; 本地方法栈中的引用对象; 方法区中静态变量的引用对象 方法区中常量的引用对象 引用的分类: 强引用: 只要强引用存在,原创 2021-07-08 14:44:34 · 175 阅读 · 0 评论 -
JAVA内存模型
内存模型 1、程序计数器: 当前线程正在执行的字节码行号指示器,唯一没有规定OOM的区域; 2、JAVA虚拟机栈: 由一个一个的栈帧组成,每一个方法的执行,对应着一个栈帧在虚拟机栈中入栈、出栈,可以抛出StackOverflowError(栈深度超过虚拟机栈最大深度)、OutOfMemoryError(虚拟机在扩展时无法申请到内存)异常。栈帧的结构包括: 3、局部变量表: 连续的内存空间,存放方法参数和局部变量,还有八大基本类型、对象引用(reference)、returnAddress类型..原创 2021-07-08 11:41:20 · 150 阅读 · 0 评论 -
JAVA线程池
核心参数 corePoolSize(核心池大小) 线程池可执行的线程数量,包含空闲的; maximumPoolSize(线程池最大大小) 线程池所允许的最大线程个数,如果使用了无界队列,则忽略该参数; keepAliveTime(线程存活时间) 超过核心池部分的线程最大可存活的时间; workQueue(任务队列) 用来保存超出核心池部分的等待线程的阻塞队列; threadFactory(线程工厂) 主要是用来给线程重命名的; handler(饱和策略) 当线程超过线程池最大大小时,需要执行的策原创 2021-07-08 11:28:12 · 104 阅读 · 0 评论 -
JAVA并发工具类介绍
Semaphore(信号灯) Semaphore接受一个整形参数,代表有几盏灯,acquire是获取一盏灯,release是释放一盏灯,相当于一个多锁的集合,获取和释放可以不在同一个线程内出现; CountDownLatch(倒计时门栓) 接收一个整形参数标识倒计时次数,countDown方法减少一次计时,await方法标识等待直到及时为0才往后执行; CyclicBarrier() 接收一个整形参数,代表参与的线程个数,不同线程调用await进入等待,当线程数量达到预设数量时,再一起执行; Coun原创 2021-07-08 11:27:27 · 68 阅读 · 0 评论 -
Volatile实现原理
正常线程在读写变量时,都是先操作自己工作内存中的变量,再通过Store操作写回主内存,这在并发情况下就会出现数据不一致的情况; 可见性: 底层加上了汇编的lock前缀指令,锁定缓存,并写回主内存,其他处理器通过嗅探机制使自己的缓存无效; 防止指令重排: 增加了内存屏障; 硬件屏障 Load Barrier:指令前插入,可使缓存失效,从主内存中读; Store Barrier:指令前插入,可使最新数据直接写入主内存,并让其他线程可见; Java屏障 Java基于这两个屏障组合出...原创 2021-07-08 11:26:23 · 182 阅读 · 0 评论 -
CAS实现原理
缓存锁定:当前处理器大部分都是使用缓存锁定来实现CAS,当某个线程操作了共享变量后,其他的处理器会有缓存嗅探机制,将其处理器中的缓存失效,重新从内存中读取缓存,基于MESI缓存一致性协议实现; 总线锁定:当一个处理器要操作共享变量时,会向总线BUS发出锁定信号,其他处理器就无法操作这个缓存了,但是会导致其他线程阻塞,增加性能开销; 某些过于老旧的处理器不支持缓存锁定; 当操作多个缓存行时或数据没被缓存时,就需要总线锁定; 处理器在执行的过程中会一直嗅探总线上对于当前缓存数据的修改,来保证MES..原创 2021-07-08 11:25:10 · 101 阅读 · 0 评论 -
Threadlocal原理及内存泄漏原因
ThreadLocal:线程间共享的全局变量; ThreadLocalMap:是ThreadLocal实现线程隔离的关键,每个线程独立维护一个这样的Map,Map的结构单元是Entry,Entry的可以是指向ThreadLocal的弱引用,value是ThreadLocal里存的值; 弱引用在下一次GC时一定会被回收,而现在的线程都是通过线程池创建,生命周期不会结束,这样就会造成线程内的Map中有存在Key为null的值,永远不会被访问到了,这就造成了内存泄漏的风险; 在Java1.8之后,Thre原创 2021-07-08 11:22:44 · 176 阅读 · 0 评论 -
ReentrantLock基础及原理
获取锁的方式: lock():获取不到就休眠,且不响应中断; tryLock():获取不到就返回false; tryLock(timeOut):timeOut时间内获取不到就返回false; lockInterruptibly():功能和lock一样,但是可以相应中断,抛出异常; 公平锁: 公平锁的实现比非公平锁多调用了hasQueuedPredecessors方法,判断如果同步器队列中有线程等待,则直接接入队尾; AQS 资源:state,全局共享,被设置为volatile,通过CAS来操作原创 2021-07-08 11:20:41 · 147 阅读 · 0 评论 -
Synchronized基础及原理
锁类型 类锁 修饰静态方法; 修饰类 以类.class为锁; 以静态变量为锁; 对象锁 修饰普通方法; 以实例对象为锁; 以局部变量为锁; 显式锁/隐式锁 锁代码块是显式锁,通过MonitorEnter和MonitorExit实现; 锁方法是隐式锁,通过ACC_SYNCHRONIZED来标记方法为同步方法,调用方法前,先获取monitor; MarkWord(对象头) Java中每个对象分为三块区域:对象头、实例数据和对齐填充; 对象头就是MarkWord;原创 2021-07-08 11:19:18 · 298 阅读 · 0 评论 -
Java中的线程和锁
线程的状态 1、初始态(NEW) 实现Runable接口,或继承Thread类new一个线程; 2、就绪态(RUNABLE) 调用start()方法; 3、运行态(RUNNING) 线程从就绪态被CPU调度,获取时间片; 4、阻塞态(三种) 1、BLOCKED ——这种状态是指一个阻塞线程在等待monitor锁; synchronized竞争锁失败; 2、WAITING ——一个线程在等待另一个线程执行一个动作时在这个状...原创 2021-07-07 15:44:12 · 310 阅读 · 0 评论 -
ConcurrentHashmap详解
1.7 基础知识: 通过Segment数组加HashEntry数组实现,Segment相当于一级hash表,一共16个,继承自ReentrantLock,是锁分段技术; 每一个HashEntry里的value都是volatile修饰的,保证其可见性,但不保证原子性; ConcurrentHashmap值和键都不能为null,多线程下容易造成歧义,因为需要根据返回值是否为null来判断节点是否被占用; Get 根据key计算hash值,定位到Segment; 再次hash,定位到Segment中的原创 2021-07-07 15:23:27 · 474 阅读 · 0 评论 -
HashMap详解
常用集合 ArrayList :变长数组,线程不安全,初始大小10,每次扩容1.5倍; LinkedList:双链表,读和更新差于ArrayList,增和删好于ArrayList; Vector:古老的类,线程安全的ArrayList,每次扩容2倍; HashSet:互异、无序的集合,基于HashMap实现,写入Key中实现去重; LinkedHashSet:互异、有序的集合,继承自HashSet; TreeSet:支持自然排序和定制排序,基于TreeMap实现; HashMap:无序的键原创 2021-07-07 15:12:57 · 122 阅读 · 0 评论