自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

秋夫人

如果说努力和拼尽全力之间有什么区别,那就是,当你努力的时候,你会觉得自己已经拼尽全力了。当你拼尽全力的时候,你会觉得自己还不够努力。

  • 博客(219)
  • 收藏
  • 关注

转载 分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案

分析spring事务@Transactional注解在同一个类中的方法之间调用不生效的原因及解决方案记录一下

2021-01-14 18:05:47 13

转载 CGLib动态代理原理

CGLib动态代理原理CGLib动态代理是代理类去继承目标类,然后重写其中目标类的方法啊,这样也可以保证代理类拥有目标类的同名方法;看一下CGLib的基本结构,下图所示,代理类去继承目标类,每次调用代理类的方法都会被方法拦截器拦截,在拦截器中才是调用目标类的该方法的逻辑,结构还是一目了然的;1.CGLib的基本使用使用一下CGLib,在JDK动态代理中提供一个Proxy类来创建代理类,而在CGLib动态代理中也提供了一个类似的类Enhancer;使用的CGLib版本是2.2.2,我是随便找的,不

2021-01-07 14:55:36 39

原创 Json转换工具类FastJsonUtil

pom.xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.44</version> </dependency>FastJsonUtil工具类package com.common

2021-01-07 12:47:35 14

转载 JDK动态代理的实现原理

JDK动态代理JDK动态代理是代理模式的一种实现方式,其只能代理接口。使用步骤 1、新建一个接口2、 为接口创建一个实现类3、 创建代理类实现java.lang.reflect.InvocationHandler接口4、 测试被代理的接口:package com.mikan.proxy; /** * @author Mikan * @date 2015-09-15 18:00 */public interface HelloWorld { void

2021-01-07 10:42:44 21

原创 记录spring cloud项目线上JVM配置

linux硬盘详情:# df -h Filesystem Size Used Avail Use% Mounted on/dev/vda1 99G 35G 60G 37% /tmpfs 7.8G 0 7.8G 0% /dev/shmlinux 内存详情:# free -h total used free shared buffers cachedMe

2020-12-31 15:35:02 26

原创 深入浅出ConcurrentHashMap1.8,是如何保证线程安全的?扩容实现详解?

前言HashMap是我们平时开发过程中用的比较多的集合,但它是非线程安全的,在涉及到多线程并发的情况,进行get操作有可能会引起死循环,导致CPU利用率接近100%。final HashMap<String, String> map = new HashMap<String, String>(2);for (int i = 0; i < 10000; i++) { new Thread(new Runnable() { @Override

2020-12-23 12:56:10 18

原创 面试题 - Redis分布式锁原理,Redisson分布式锁原理,Redis分布式锁缺点

Redis分布式锁原理分布式锁,是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中,常常需要协调他们的动作。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要互斥来防止彼此干扰来保证一致性,在这种情况下,便需要使用到分布式锁。使用setnx、getset、expire、del这4个redis命令实现setnx 是『SET if Not eXists』(如果不存在,则 SET)的简写。 命令格式:SETNX key value;使用:只在键 k

2020-12-22 16:44:53 67

原创 面试题 - Spring 如何解决循环依赖?

Spring是如何解决循环依赖的问题的。spring可以解决属性注入循环依赖,默认不能解决构造器注入循环依赖spring创建对象分两步,①初始化实例对象,②初始化对象属性spring循环依赖,最初引用的就是半成品,也就是只初始化示例对象,还没有初始化对象属性因此解决了循环依赖问题。spring循环依赖原理这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。本文主要针对这个问题,从源码的角度对其实现原理进行讲解。1.

2020-12-22 14:42:42 82

转载 面试题 - spring 事务

Spring事务的配置方式Spring支持编程式事务管理以及声明式事务管理两种方式。1. 编程式事务管理编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用,PlatformTransactionManager,对于编程式事务管理,Spring推荐使用TransactionTemplate,编程式事务粒度可以到代码级别。2. 声明式事务管理声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据

2020-12-22 12:54:09 22

转载 面试题 - MySQL优化技巧

MySQL优化三大方向① 优化MySQL所在服务器内核(此优化一般由运维人员完成)。② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整。③ 对SQL语句以及表优化。MySQL参数优化MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看mysql> show variables like ‘max_connections’;2:查看当前访问Mysql的线程mysql> show processlist;3:设置最大

2020-12-21 22:02:38 27

原创 Java 原子性CAS 原理 ,atomic包 详解

java.util.concurrent.atomic包类的原理atomic包底层原理都是Unsafe.compareAndSwapXXX()方法,也就是通常说的CAS,compareAndSwapXXX方法是native标识的方法,是Java底层代码,不是Java代码实现的,public final class Unsafe { //object public final native boolean compareAndSwapObject(Object obj, long offset,

2020-12-15 14:42:30 39

原创 StampedLock源码详解解析

StampedLockStampedLock 是Java.util.concurrent并发包里JDK1.8版本新增的一个锁,该锁是对读写锁ReentrantReadWriteLock的增强,优化了读锁、写锁的访问,同时使写锁之间可以相互转换,更细粒度控制并发。StampedLock的主要特点概括一下,有以下几点:所有获取锁的方法,都返回一个邮戳(Stamp),Stamp为0表示获取失败,其余都表示成功;所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Sta

2020-11-20 14:16:23 23

原创 AQS 源码解析 - 结合ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier,Semaphor

JDK1.5以前只有synchronized同步锁,并且效率非常低,因此大神Doug Lea自己写了一套并发框架,这套框架的核心就在于AbstractQueuedSynchronizer类(即AQS),性能非常高,所以被引入JDK包中,即JUC。那么AQS是怎么实现的呢?本篇就是对AQS及其相关组件进行分析,了解其原理,并领略大神的优美而又精简的代码。AbstractQueuedSynchronizerAQS是JUC下最核心的类,没有之一,所以我们先来分析一下这个类的数据结构。AbstractQ

2020-11-11 21:34:56 56

原创 数据结构可视化地址

https://www.cs.usfca.edu/~galles/visualization/Algorithms.html数据结构可视化David Galles 旧金山大学计算机科学系当前,我们具有以下数据结构和算法的可视化:基本堆栈:数组实现堆栈:链表实现队列:数组实现队列:链表实现列表:数组实现(在Java版本中可用)列表:链接列表实现(在Java版本中可用)递归阶乘反转字符串N皇后问题索引编制二进制和线性搜索(排序列表)二叉搜索树AVL树(平衡二进制搜索树)

2020-10-29 22:20:15 25

翻译 面试题 - JVM内存结构

JVM内存结构JVM 可以分为 5 个部分,分别是:类加载器(Class Loader):加载字节码文件到内存。运行时数据区(Runtime Data Area):JVM 核心内存空间结构模型。执行引擎(Execution Engine):对 JVM 指令进行解析,翻译成机器码,解析完成后提交到操作系统中。本地库接口(Native Interface):供 Java 调用的融合了不同开发语言的原生库。本地方法库(Native Libraies):Java 本地方法的具体实现。这其中最复杂

2020-10-28 15:05:57 79

原创 面试题 - synchronized 和Lock区别

一、synchronized实现原理Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁是当前实例对象静态同步方法,锁是当前类的class对象同步方法块,锁是括号里面的对象当一个线程访问同步代码块时,它首先是需要得到锁,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?我们先看一段简单的代码:public class SynchronizedTest { public synchronized void test1(){

2020-10-26 13:20:22 192

原创 面试题 - ThreadLocal详解

目录(jdk1.8)一、什么是ThreadLocal二、ThreadLocal怎么用三、ThreadLocal的原理四、ThreadLocal源码分析1.ThreadLocal的内部属性2.ThreadLocal 之 set() 方法3.ThreadLocal 之 get() 方法4.TreadLocal的remove方法5.内部类ThreadLocalMap的基本结构和源码分析5.1先看成员和结构部分5.2接着看ThreadLocalMap的构造函数5.

2020-09-30 17:29:07 1559

原创 面试题 - Java泛型、协变、逆变、类型擦除

Java 泛型之-协变&逆变先说一下java中的协变,逆变,不可变:假设有如下类:class Food{} // 默认继承Objectclass Fruit extends Food{}class Meat extends Food {}class Apple extends Fruit{}class Beef extends Meat{}逆变与协变Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型

2020-09-21 16:44:40 63

原创 面试题 - Java Comparable和Comparator 区别

Comparablepackage java.lang;public interface Comparable<T> { public int compareTo(T o);}Comparatorpackage java.util;public interface Comparator<T> { //必须实现的方法 int compare(T o1, T o2); //选择实现 boolean equals(Object obj)

2020-09-15 22:12:11 87

转载 面试题 - Java序列化和反序列化

Java 序列化的高级认识引言将 Java 对象序列化为二进制文件的 Java 序列化技术是 Java 系列技术中一个较为重要的技术点,在大部分情况下,开发人员只需要了解被序列化的类需要实现 Serializable 接口,使用 ObjectInputStream 和 ObjectOutputStream 进行对象的读写。然而在有些情况下,光知道这些还远远不够,文章列举了笔者遇到的一些真实情境,它们与 Java 序列化相关,通过分析情境出现的原因,使读者轻松牢记 Java 序列化中的一些高级认识。文章

2020-09-15 18:03:22 225

原创 Spring Boot(Cloud ) 测试类Test示例 MockMvc

Spring Boot(Cloud ) 测试类Test示例 MockMvcget请求工具类:import com.credithc.common.util.FastJsonUtil;import org.junit.Assert;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.t

2020-09-03 11:17:49 90

原创 CentOS7 64位 安装mycat 详细教程,管理命令

mycat官网地址下载:mkdir -p tools/mycatcd tools/mycat/wget http://dl.mycat.io/1.6.7.4/Mycat-server-1.6.7.4-release/Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz解压:tar -zxvf Mycat-server-1....

2020-04-20 10:32:59 186

转载 Mysql(双主)主主架构配置搭建教程

mysql主从方案,有一主多从,读写分离等功能,但是单主存在单点故障,从库切换成主库需要作改动等缺点。因此,如果是双主或者多主,就会增加mysql入口,增加高可用。不过多主需要考虑自增长ID问题,这个需要特别设置配置文件,比如双主,可以使用奇偶,总之,主之间设置自增长ID相互不冲突就能完美解决自增长ID冲突问题。MySQL双主(主主)架构方案思路是:两台mysql都可读写,互为主备,默认...

2020-04-20 08:30:25 210

原创 mysql redo log日志 和binlog日志区别

不同点:MySQL 整体来看,其实就有两块:一块是 Server 层,它主要做的是 MySQL 功能层面的事情;还有一块是引擎层,负责存储相关的具体事宜。redo log 是 InnoDB 引擎特有的日志而 Server 层也有自己的日志,称为 binlog(归档日志)。(1)redo log 是 InnoDB 引擎特有的;binlog 是 MySQL 的 Server 层实现的,所有引擎...

2020-04-18 10:35:28 323

原创 CentOS7 下mysql主从复制搭建

目标:搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,实现主从复制环境:  主数据库: 192.168.169.138  从数据库: 192.168.169.137查看mysql启动状态:service mysqld status配置步骤:1、保证两个数据库中的库和数据是一致的;2、在主数据中创建一个同步账号(可不创建使用现有的),如果仅仅为了主从复制创建账号,只需要...

2020-04-18 08:33:11 318

原创 CentOS7 64位安装mysql详细教程

从最新版本的linux系统开始,默认的是 Mariadb而不是mysql!这里依旧以mysql为例进行展示1、先检查系统是否装有mysql#rpm -qa | grep mysql这里返回空值,说明没有安装这里执行安装命令是无效的,因为centos-7默认是Mariadb,所以执行以下命令只是更新Mariadb数据库#yum install mysql删除可用#yum remove...

2020-04-17 16:22:31 154

原创 IDEA设置 (Ctrl+滚轮) 调整字体大小,快捷键调整字体大小

IDEA设置Ctrl+滚轮调整字体大小打开idea 设置界面:保存后,ctrl+滚轮就能改变代码字体大小

2020-03-29 11:20:58 1202

原创 JConsole连接远程服务器方法

jconsole远程连接,必须配置JMX连接参数linux 启动项目时,添加参数java -Djava.rmi.server.hostname=10.160.13.111 #远程服务器ip,即本机ip-Dcom.sun.management.jmxremote #允许JMX远程调用-Dcom.sun.management.jmxremote.port=3214 #自定义jmx 端口号...

2019-10-08 14:11:13 7791 1

原创 springcloud整合(单机)redis哨兵 配置

单机redis ,配置两个哨兵redis:10.100.11.85:6379两个哨兵:10.100.11.85:26379,10.100.11.85:26380pom.xml<!-- redis --> <dependency> <groupId>org.springframework.boot</group...

2019-08-13 10:20:20 1151

原创 J.U.C-FutureTask

Callable 与Runnable 接口对比Runnable 是个接口,只有一个方法run(),实现Runnable的run(),把要实现的逻辑写到run()中,然后启动线程就行;Callable 代码也很简单,不同的是,Callable 是个泛型接口,call(),返回类型是传入的泛型,Callable 与Runnable大致相似,Callable 功能更强大写,主要是Callable...

2019-01-18 12:18:53 144

原创 J.U.C之AQS之 ReentrantLock与synchronize区别、ReentrantReadWriteLock、StampedLock

J.U.C之AQS之ReentrantLock与锁ReentrantLock(可重入锁) 与synchronize 区别(1)、可重入性ReentrantLock与synchronize 都具有可重入性,就是同一个线程已经获得了锁,可以再多次获取当前锁,解锁次数要与加锁次数相同,才能释放锁。(2)、锁的实现ReentrantLock 是通过JDK 实现的,synchronize 是JV...

2019-01-17 18:39:13 375

原创 Leetcode - java - 24. 两两交换链表中的节点

题目给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。示例:给定 1-&amp;gt;2-&amp;gt;3-&amp;gt;4, 你应该返回 2-&amp;gt;1-&amp;gt;4-&amp;gt;3.说明:你的算法只能使用常数的额外空间。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。解题(1)、用时 4ms/** * Definition for singly-linked list. * ...

2019-01-17 14:04:02 305

原创 Leetcode - java - 206.反转一个单链表 - 图解

题目:反转一个单链表。示例:输入: 1-&amp;amp;amp;amp;gt;2-&amp;amp;amp;amp;gt;3-&amp;amp;amp;amp;gt;4-&amp;amp;amp;amp;gt;5-&amp;amp;amp;amp;gt;NULL输出: 5-&amp;amp;amp;amp;gt;4-&amp;amp;amp;amp;gt;3-&amp;amp;amp;amp;gt;2-&amp;amp;amp

2019-01-17 12:01:08 436

原创 J.U.C之AQS之 CountDownLatch、Semaphore、CyclicBarrier

J.U.C之AQS - 介绍J.U.C(java.util.concurrent)在jdk1.5引入,引入J.U.C大大提高了java的并发性能,AQS(AbstractQueuedSynchronizer的缩写) 可以认为是J.U.C的核心,AQS 可以说是并发类中的重中之重,AQS 提供了基于firstIn,firstOut队列,这个队列可以用来构建锁或者其他相关的同步装置的基础框架 A...

2019-01-16 19:17:11 167

原创 并发容器及安全共享策略总结

并发容器及安全共享策略总结J.U.C指的java.util.concurrent包并发容器 - CopyOnWriteArrayListCopyOnWriteArrayList 相比ArrayList 是线程安全的,根据名称知道:写操作时复制;写操作时拷贝一份,在新的数组上进行写操作,操作完之后,再将原来的数组指向新的数组。(CopyOnWriteArrayList整个add操作都是在...

2019-01-16 11:59:55 210

原创 同步容器

线程安全 - 同步容器同步容器 - VectorVector 不是线程安全的执行结果:报错,原因:当一个线程remove(i)时,同时另一个线程get(j), i=j,此时就回报错Vector 遍历同步容器或者普通容器中,test1(),test2(),方法都会抛异常,因为在遍历时进行了移除操作,如果要移除Vector元素,可以先做标识,遍历完之后再进行移除,也推荐直接用fo...

2019-01-16 09:28:48 86

原创 线程不安全类与写法

线程不安全类什么是线程不安全的类:如果一个类的对象可以同时被多个对象访问,如果不做特殊的同步或者并发的处理,就会很容易表现出线程不安全的现象,比如抛出异常,逻辑处理错误等等StringBuilder执行结果:499049984993线程不安全的StringBuffer执行结果:500050005000线程安全的SimpleDateFormat执行结果:不是线...

2019-01-15 18:44:10 238

原创 线程封闭 - threadLocal简单用法

线程封闭把对象封装到一个线程里,只有这一个线程能看到这个对象。所以即使这个对象不是线程安全的,也不会出现线程安全的问题了。创建类RequestHolder,定义一个静态成员变量ThreadLocal requestHolder = new ThreadLocal&amp;lt;&amp;gt;();并定义三个方法,add(),getId(),remove(),分别表示想requestHolder 中添...

2019-01-15 15:29:47 168

原创 不可变对象 final、 Collections.unmodifiable、guava的 Immutable**

可以采用的方式包括:1、将类声明为final,这样就不能继承了2、将所有成员声明为私有的,这样就不允许直接访问这些成员3、对变量不提供set方法,将所有可变成员声明为final,这样只能赋值一次4、通过构造器初始化所有成员,进行深度拷贝,在get方法中不返回对象本身,而是返回克隆对象,即对象的深度拷贝finalfinal类不能被继承,参考Stringfinal基本数据类型变量赋值...

2019-01-14 21:02:32 223

原创 安全发布对象 - 四种方法 单例模式

执行结果:执行结果:

2019-01-14 20:06:06 1016

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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