自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 分布式事务常见解决方案

TCC分布式事务TCC (Try-Confirm-Cancel)是一种比较成熟的分布式数据一致性解决方案,它实际上是把一个完整的业务拆分为如下三个步骤。Try:这个阶段主要是对数据的校验或者资源的预留。Confirm:确认真正执行的任务,只操作Try阶段预留的资源。Cancel:取消执行,释放Try阶段预留的资源。TCC是一种两阶段提交的思想,第一阶段通过Try执行准备工作,第二阶段Confirm/Cancel进行对第一阶段操作的提交/回滚。基于可靠性消息的最终一致性方案基于可靠性消

2021-02-27 22:00:37 146

原创 X/Open DTP分布式事务模型与两/三阶段提交协议

X/Open DTP分布式事务模型一套分布式事务标准,使用了两阶段提交来保证分布式事务的完整性。包含的三种角色:AP:Application,表示应用程序。RM:Resource Manager,表示资源管理器,比如数据库。TM:Transaction Manager,表示事务管理器,一般指事务协调者,负责协调和管理事务。两阶段提交协议准备阶段:TM通知RM准备分支事务,记录事务日志,RM告知TM准备结果。提交/回滚阶段:所有的RM在准备阶段都返回了成功,TM就向所有的RM发起提

2021-02-27 22:00:04 208

原创 docker-compose搭建高可用redis哨兵集群读写分离,并用SpringBoot连接CRUD

项目地址:https://gitee.com/little_wear/docker-compose-redis-sentinel-spring-boot文件结构.├── conf #redis和sentinel的配置│ ├── redis1.conf│ ├── redis2.conf│ ├── redis3.conf│ ├── sentinel1.conf│ ├── sentinel2.conf│ └── sentinel3.conf├── data #red.

2021-02-27 21:58:18 376

原创 docker-compose搭建nacos集群+nginx负载均衡

项目地址:https://gitee.com/little_wear/docker-compose-nacos-nginx文件结构.├── conf│ └── nginx.conf #nginx的配置├── data #容器数据卷目录│ ├── cluster-logs│ ├── init.d │ └── mysql├── docker-compose.yaml└── env #mysql和nacos的一些配置 ├── mysql.env └── na.

2021-02-27 21:57:19 745 4

原创 Java之List的使用以及简单原理

类图结构介绍有序集合(也称为序列)。使用该接口可以精确控制列表中每个元素的插入位置。用户可以通过其整数索引(列表中的位置)访问元素,并在列表中搜索元素。常用实现类有ArrayList,LinkedList,CopyOnWriteArrayList(线程安全)。常用API方法说明int size();列表元素个数boolean isEmpty();是否为空boolean contains(Object o);是否包含某个元素boolean add(E

2021-02-27 21:45:08 210

原创 Java之Map的使用以及简单原理

类图结构介绍将键映射到值的对象。映射不能包含重复的键;每个键最多可以映射到一个值。key-value结构。Map接口代替了Dictionary这个抽象类。常用实现类有,HashMap,TreeMap,LinkedHashMap,ConcurrentHashMap(线程安全)。常用API方法说明int size();返回此映射中的键值映射数boolean isEmpty();此Map是否为空boolean containsKey(Object key);

2021-02-27 21:44:12 146

原创 RcoketMQ连接时报错sendDefaultImpl call timeout解决

RcoketMQ连接时报错sendDefaultImpl call timeout解决代码是这样:报错是这样的:这报个错啥也不说清楚,真的牛批。解决过程:上网搜sendDefaultImpl call timeout,然后要看什么broker有没有注册到name server上啊,改配置文件啊,开端口啊,开了9876和10911,但是都没有解决。然后我想是不是需要多给rocketmq一点耐心,于是我就在send的时候加了等待时间。虽然问题没解决,当时报错缺说明了原因:好像是需要连1

2020-11-25 00:08:55 1605 2

原创 MySQL常用数据类型

整数类型包含:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT。分别使用8(1),16(2),24(3),32(4),64(8)**位(字节)**存储空间。整数类型有可选的UNSIGNED属性,表示不允许负值,可以让正数的上限提高一倍。类型只是决定怎么在内存和磁盘中保存数据。然而在计算时一般使用64位的BIGINT。MySQL可以为整数类型指定宽度,例如INT(11),对大多数应用这是没有意义的:它不会限制值的合法范围,只是规定了MySQL的一些交互工具(例如MySQL命

2020-10-18 14:26:58 116

原创 SpringAop具体流程

BeanFactoryAspectJAdvisorsBuilder:用于从BeanFactory检索@AspectJ bean并基于它们构建Spring Advisor的帮助程序,以与自动代理一起使用。buildAspectJAdvisors:在当前的bean工厂中查找带有Aspect注释的aspect bean,然后返回代表它们的Spring AOP Advisor列表。先获取到aspectBeanNames,如果为空,则去寻找带有@Aspect注解的bean。寻找到带@Aspect的bea..

2020-10-06 16:28:02 212

原创 Spring之ApplicationContext#refresh启动全部流程

1:prepareRefresh主要是做一些环境上的准备。清理scanner的缓存。把容器状态切换为active。在上下文环境中初始化任何占位符属性源。验证标记为所需的所有属性是否可解析。存储预刷新ApplicationListeners。Allow for the collection of early ApplicationEvents。2:obtainFreshBeanFactory告诉子类刷新内部bean工厂,主要是设置了serializationId=“allicati

2020-10-05 19:39:02 540

原创 Redis8大数据类型与命令

key相关keys:查找所有key。exists key:查找key是否存在。move key db:移动key到指定db。expire key seconds:设置指定key的过期seconds。ttl key:查看key的过期时间。type key:查看key的类型。String命令描述SET key value设置指定 key 的值GET key获取指定 key 的值。GETRANGE key start end返回 key 中字符串值的子字符

2020-09-28 13:03:40 127

原创 事务,事务隔离等级,脏读,不可重复读,幻读,Spring事务管理@Transactional

事务就是一组由于逻辑上紧密关联而合并成一个整体(工作单元)的多个数据库操作,这些操作要么都执行,要么都不执行。事务的四个关键属性(ACID):原子性(atomicity):“原子”的本意是“不可再分”,事务的原子性表现为一个事务中涉及到的多个操作在逻辑上缺一不可。事务的原子性要求事务中的所有操作要么都执行,要么都不执行。一致性(consistency):“一致”指的是数据的一致,具体是指:所有数据都处于满足业务规则的一致性状态。一致性原则要求:一个事务中不管涉及到多少个操作,都必须保证事务执..

2020-09-02 18:57:18 1115

原创 Spring AOP的@Pointcut与@DeclareParents

@Aspect:将此类标记为一个Advisor。@EnableAspectJAutoProxy ** 表示若spring创建的对象如果实现了接口,默认使用jdk动态代理,如果没有实现接口,使用cglib创建代理对象。@EnableAspectJAutoProxy(proxyTargetClass = true)将只使用cglib。SpringBoot默认会配置EnableAspectJAutoProxy,可以通过spring.aop.prox-target-class设置proxyTargetClass.

2020-09-01 13:22:52 171

原创 7分钟看懂Spring Bean创建过程中的循环依赖的解决

Bean创建过程中的循环依赖的解决准备2个互相依赖的类。外加一个容器。调用AbstractBeanFactory中的doGetBean,执行到getSingleton(beanName)方法,发现没有获取到。​ getSingleton方法如下:调用AbstractBeanFactory中的doGetBean,执行到getSingleton(beanName,ObjectFactory)方法,进行implA的创建。进入了DeafultSingletonBeanRegis

2020-08-31 23:17:10 199

原创 Java锁框架AQS源码解析

点击此处去Gitee上Clone源码下来在IDE上看效果更佳package java.util.concurrent.locks;import sun.misc.Unsafe;import java.util.ArrayList;import java.util.Collection;import java.util.Date;import java.util.concurrent.TimeUnit;/** * 提供一个框架,用于实现依赖于先进先出(FIFO)等待队列的阻塞锁和相关的同

2020-08-29 15:49:21 100

原创 Java线程池之ThreadPoolExecutor源码解析

点击此处去Gitee上Clone源码下来在IDE上看效果更佳Executorpackage java.util.concurrent;/** * 执行提交的可运行任务的对象。 */public interface Executor { /** * 在将来的某个时间执行给定命令。 * 根据{@code Executor}实现的判断,命令可以在新线程,池线程或调用线程中执行。 * * @param command the runnable

2020-08-26 19:37:12 128

原创 Java多线程之Runnable,Callable,Future,RunnableFuture,FutureTask

点击此处去Gitee上Clone下来在IDE上看效果更佳Runnablepackage java.lang;@FunctionalInterfacepublic interface Runnable { /** * 执行任务,没有返回值。 */ public abstract void run();}Callablepackage java.util.concurrent;/** * 一个返回结果并可能引发异常的任务。 */@Fu

2020-08-26 10:50:07 271

原创 Java之Thread源码解析,Thread的6种状态

package java.lang;import sun.nio.ch.Interruptible;import sun.reflect.CallerSensitive;import sun.reflect.Reflection;import sun.security.util.SecurityConstants;import java.lang.ref.Reference;import java.lang.ref.ReferenceQueue;import java.lang.ref..

2020-08-25 22:44:46 558

原创 Java阻塞队列之DelayQueue源码解析

package java.util.concurrent;import java.util.*;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;import static java.util.concurrent.TimeUnit.NANOSECONDS;/** * 一种由延迟元素组成的无界阻塞队列,其中一个元素只有在其延迟过期时才能被获取。 * 队列.

2020-08-25 18:48:32 108

原创 Java同步队列SynchronousQueue源码解析

package java.util.concurrent;import java.util.*;import java.util.concurrent.locks.LockSupport;import java.util.concurrent.locks.ReentrantLock;/** * 一种阻塞队列,每个插入操作都必须等待另一个线程执行相应的删除操作,反之亦然。 * 队列不存储数据,所以没有大小,也无法迭代。 * 由两种数据结构组成 * 1.后入先出的栈,非公平模式。 * 2.

2020-08-25 10:57:40 194

原创 java之LockSupport的使用及源码

package java.util.concurrent.locks;/** * 用于创建锁和其他同步类的基本线程阻塞原语。 */public class LockSupport { private LockSupport() { } // 静态工具类,无法被实例化,硬是要用反射实例化那也没办法。 /*常用的park与unpark方法*/ /** * 为线程调度目的禁用当前线程,除非许可证可用。 * <p> * 如果许可

2020-08-24 22:54:06 176

原创 7分钟看懂Java的volatile关键字

volatileJava虚拟机提供的最轻量级同步机制,保证有序性(禁止指令重排序)和可见性(使用被修饰变量前会重新从主存加载,赋值后会刷回主存,以保证每个线程用的此变量都是最新值)。在经典double-check单例模式中,单例不使用volatile修饰,在并发量很高的情况下就有可能出现因指令重排序而出现错误。 private volatile static Singleton instance; private int a; private Singleton(){ a=7

2020-08-24 20:01:57 125

原创 Java阻塞队列之LinkedBlockingQueue源码解析

package java.util.concurrent;import java.util.*;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;import java.util.function.Consumer;/** * 基于链表的阻塞队列 * 头尾都有

2020-08-23 10:37:56 155

原创 Java阻塞队列之ArrayBlockingQueue源码解析

package java.util.concurrent;import java.lang.ref.WeakReference;import java.util.*;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * 由数组支持的有界阻塞队列。 * 队列满时,往队列中 put 数据会被阻塞,队列空时,往队列中拿数据也会被阻塞。 * 此类支持一个.

2020-08-22 23:23:34 119

原创 Java编译器优化技术

方法内联把目标方法的代码原封不动地“复 制”到发起调用的方法之中,避免发生真实的方法调用。逃逸分析基本原理:分析对象动态作用域,当一个对象在方法里面被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他方法中,这种称为方法逃逸;甚至还有可能被外部线程访问到,譬如赋值给可以在其他线程中访问的实例变量,这种称为线程逃逸;从不逃逸、方法逃逸到线程逃逸,称为对象由低到高的不同逃逸程度。栈上分配:**确定一个对象不会逃逸出线程之外,那让这个对象在栈上分配内存将会是一个很不错的主意,对象所占用的内存

2020-08-22 21:55:02 235

原创 Java并发集合之ComcurrentHashMap源码解析

/** * 支持多个线程同时进行put,remove * 迭代过程中,即使Map结构被修改,也不会抛出ConcurrentModificationException * 除了数组+链表+红黑树,还增加了转移节点,保证了扩容时的线程安全,但是,迭代器一次只能由一个线程使用。 * 此类不允许将null用作键或值。 * put等修改方法只会锁单个槽点。 * 转移(扩容)时是一部分一部分地转移,当put等修改方法,遇到正在转移的槽点,会帮助转移。 */public class Concurrent.

2020-08-22 17:43:33 231 1

原创 Java集合Map的compute方法

Map接口的默认实现,子类实现会有所不同,但是道理都一样比如:

2020-08-22 17:40:33 2146

原创 Java并发集合之CopyOnWriteArrayList源码解析

package java.util.concurrent;import sun.misc.SharedSecrets;import java.util.*;import java.util.concurrent.locks.ReentrantLock;import java.util.function.Consumer;import java.util.function.Predicate;import java.util.function.UnaryOperator;/** * 线程

2020-08-21 23:51:35 152

原创 Java集合之TreeSet源码

package java.util;/** * 底层是组合的一个 {@link NavigableMap},一般用的就是{@link TreeMap},性质与TreeMap相同。 * 基本上所有的方法都是调用底层NavigableMap的方法 */public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serial

2020-08-21 20:12:27 155

原创 Java集合之HashSet源码解析

package java.util;import sun.misc.SharedSecrets;import java.io.InvalidObjectException;/** * 组合了HashMap,拥有HashMap的所有特性。 * 相当于就是HashMap,只不过Value是一个默认的值,只能put(K key) */public class HashSet<E> extends AbstractSet<E> imple.

2020-08-21 17:25:01 165

原创 Java集合之LinkedHashMap源码解析

package java.util;import java.io.IOException;import java.util.function.BiConsumer;import java.util.function.BiFunction;import java.util.function.Consumer;/** * 此类会维护一个双向链表,迭代时会按照这个链表进行有顺序的迭代 * 顺序可以为插入顺序,也可以为访问顺序。{@link accessOrder}true为访问顺序,false.

2020-08-21 17:07:53 135

原创 Java集合之TreeMap源码解析

package java.util;import java.io.Serializable;import java.util.function.BiConsumer;import java.util.function.BiFunction;import java.util.function.Consumer;/** * 基于红黑树的NavigableMap实现。是一个可以按照Key排序的Map。 * 可以按照Key实现的Comparable排序,也可以按照传入的Comparator就行排.

2020-08-21 14:46:03 112

原创 Java集合之HashMap源码解析

package java.util;import sun.misc.SharedSecrets;import java.io.IOException;import java.io.InvalidObjectException;import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.lang.reflect.Type;import java.util.function.BiConsu

2020-08-21 09:16:51 140

原创 Java之LinkedList源码解析

package java.util;import java.util.function.Consumer;/** * 链表结构List,实现了List,Deque接口 */public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializabl.

2020-08-20 19:55:32 124

原创 Java之ArrayList源码解析

package java.util;import sun.misc.SharedSecrets;import java.util.function.Consumer;import java.util.function.Predicate;import java.util.function.UnaryOperator;public class ArrayList<E> extends AbstractList<E> implements List&lt.

2020-08-20 17:39:55 80

原创 不会还有人不懂Java线程安全与锁优化,无锁,偏向锁,轻量级锁,重量级锁升级过程吧

线程安全与锁优化线程安全定义:当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那就称这个对象是线程安全的。Java语言中的线程安全可以将Java语言中各种操作共享的数据分为以下五类:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。不可变:不可变的对象一定是线程安全的,无论是对象的方法实现还是方法的调用者,都不需要再进行任何线程安全保障措施。如果多线

2020-08-18 15:58:46 283

原创 Java内存模型与线程

Java内存模型与线程硬件的效率与一致性缓存一致性协议:当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作。乱序执行优化:为了使处理器内部的运算单元能尽量被充分利用,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,Java虚拟机的即时编译器中也有指令重排序优化。Java内存模型(JMM

2020-08-17 21:41:50 91

原创 Java泛型

泛型Java选择的泛型实现方式叫作“类型擦除式泛型”。它只在程序源码中存在,在编译后的字节码文件中,全部泛型都被替换为原来的裸类型。裸类型应被视为所有该类型泛型化实例的共同父类型。泛型通配符当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示(比如 void method(List<?> list))。但是一旦 使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。只能作为参数使用。受限泛型之前设置泛型的时

2020-08-15 17:50:01 74

原创 Java方法调用过程

方法调用解析所有方法调用的目标方法在Class文件里面都是一个常量池中的符号引用,在类加载的解析阶段,会将其中的一部分符号引用转化为直接引用,这种解析能够成立的前提是:方法在程序真正运行之前就有一个可确定的调用版本,并且这个方法的调用版本在运行期是不可改变的。换句话说,调用目标在程序代码写好、编译器进行编译那一刻就已经确定下来。这类方法的调用被称为解析。主要有静态方法和私有方法两大类,符合“编译期可知,运行期不可变”这个要求。调用不同类型的方法,字节码指令集里设计了不同的指令。invok

2020-08-15 00:23:02 258

原创 Java Class类文件的结构

Class类文件的结构魔数与Class文件的版本。常量池:Class文件里的资源仓库。字面量:如文本字符串,被声明为final的常量。符号引用被模块导出或者开放的包(Package)类和接口的全限定名(Fully Qualified Name)字段的名称和描述符(Descriptor)方法的名称和描述符方法句柄和方法类型(Method Handle、Method Type、Invoke Dynamic)动态调用点和动态常量(Dynamically-Computed Call

2020-08-14 17:01:37 98

空空如也

空空如也

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

TA关注的人

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