自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java 四种引用类型及应用场景

强引用:Java中默认声明的就是强引用。只要强引用存在,JVM永远不会回收。//只要obj还指向Object对象,Object对象就不会被回收Object obj = new Object(); //手动置nullobj = null; 软引用:可以当成缓存使用,只有在内存不足的时候才会回收。弱引用:只要进行垃圾回收就会被回收。WeakHashMap,ThreadLocal中应用。虚引用:在回收时得到通知。Nio通过它来实现对直接内存的释放。...

2021-06-17 19:50:07 3

原创 SpringBoot @Scheduled 执行两次的问题

网上有各种说是Tomcat的解决方法,这些并不能解决我的问题。我的情况是这样的:我在写定时任务的时候,想通过配置文件的值来控制是否执行定时任务,于是有了以下的代码:@Configurationpublic class ScheduledConfig{ @ConditionalOnProperty(prefix="scheduled",value="enable",havingValue="true") @Bean public ScheduledAnnotationBeanPostPr

2021-06-16 16:40:49 6

原创 SpringBoot 工具类项目打包问题

SpringBoot项目打包时出现:repackage failed: Unable to find main class Maven原因是没有主类(Main函数),由于是工具包,不需要主类。正常来说是可以打包的,但是有写引入的依赖会包含一个打包插件导致不能打包。解决方法是去掉这个插件:<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId>

2021-06-15 16:24:42 11

原创 Java ExecutorService的execute方法和submit方法的区别

execute:提交后如果线程运行后,和主线程就脱离了关系了。当线程的执行过程中抛出了异常,主线程无法获取到异常的信息。submit:线程执行过程中,出现异常,主线程会得到异常直接使用submit,异常也不会显示可以通过sumbit返回Future对象,根据Future.get进行异常捕获...

2021-06-15 15:46:06 2

原创 Java 1.7与1.8的ConcurrentHashMap的区别

【1.7】1.结构:Segment+hashEntry2.先找Segment然后上锁再找hashEntry,如果Segment被锁了就先自旋,一定次数转互斥锁3.通过UNSAFE.getObjectVolatile()保证Segment之间的可见性4.求size():不上锁执行三次计算size,如果相邻两次修改次数相同,则返回;如果三次都不同则锁住所有segment计算5.初始16个segment6.节点是hashEntry7.Segment通过继承ReentrantLock实现对Segmen

2021-06-15 15:39:38 7

原创 JVM Minor GC、Full GC和Major GC

Minor GC触发机制:从年轻代回收内存,Eden区满了会触发Minor GC,Survivor区满了不会触发。young gcMajor GC触发机制:清理老年代。old gcFull GC触发机制:(1)调用System.gc时,系统建议执行Full GC,但是不必然执行(2)老年代空间不足(3)方法区空间不足(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存(5)由Eden区、survivor space1(From Space)区向survivor space2

2021-06-15 15:34:36 3

原创 Java 读写锁

总结了一下Java的读写锁实现ReadWriteLock最简单的就是【ReentrantReadWriteLock】,但是有一个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种【悲观锁】。StampedLock为了提高效率,jdk1.8引入了新的读写锁【StampedLock】:读的过程中也允许获取写锁后写入!这样一来,我们读的数据就可能不一致,所以,需要一点额外的代码来判断读的过程中是否有写入,这种读锁是一种【乐观锁】。是不可重入锁。验

2021-06-14 22:07:30 3

原创 SpringBoot 使用https

将证书的jks/p12/keystore文件放到resource下配置文件添加:server: ssl: key-store: classpath:5128625_licence.xxxxx.jks key-store-password: WiA212NP key-store-type: jks

2021-06-14 21:24:34 12

原创 Java 高性能队列Disruptor

在Disruptor中,生产者不断生产数据,并将数据持续放入一个环形缓冲区RingBuffer中。消费者通过onEvent()方法监听RingBuffer,当生产者向RingBuffer中添加数据时(publish),会触发消费者的onEvent()方法并发传递数据对象,生产和消费的数据对象@Datapublic class DataEvent { private String value;}生产数据的工厂类,生产者没有创建对象只是拿到缓存区的对象赋值,数据对象是缓冲区创建的publi

2021-06-09 16:47:54 11

原创 JPA 多线程对数据进行更新,Update和Insert同时存在的问题

对同一个key进行更新,如果有就累加,如果没有就创建,保证多线程下正确执行这个对应MySQL和PgSQL是不一样的,因为MySQL是有间隙锁的(会对要insert的key上锁,虽然还没有存到数据库中)MySQl的解决方法如下 @Override @Transactional public void test() { // 这里如果继续使用findByOrderId()方法会导致下面B()里无法读到已经更新的值 boolean flag = orderDa

2021-06-09 15:54:20 11

原创 JPA 多线程同时对一条数据进行Update的问题

在多线程的情况下对同一条数据进行更新累加操作,如果不做任何处理会导致数据更新异常比如现在做一个查询数据库一条数据,并对其进行+100的操作:public void test() { Optional<UserEntity> optional = userDao.findByUserIdentify("ccccc"); UserEntity userEntity = optional.get(); userEntity.setOther(String.valueO

2021-06-09 15:52:53 9

原创 PostgreSQL 关闭session链接

删库删不掉因为还有链接没有释放。释放sql: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='数据库名';

2021-06-09 15:45:43 32

原创 Java LinkedHashMap

LinkedHashMap继承HashMap,但相对HashMap有以下不同1.插入是有顺序的,底层的Entry通过继承HashMap.Node,添加一个before和after结点实现插入有序2.支持访问顺序 创建时调用构造函数LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder),指定第三个参数为true3.LinkedHashMap的removeEldestEntry(Map.Entry eldest)方法,

2021-06-08 21:39:50 3

原创 Redis 六种淘汰策略和三种删除策略

【六种淘汰策略】1.【noeviction】不删除策略,达到最大内存,再插入直接报错2.【allkeys-lru】所有key通用,优先删除最少使用的key3.【volatile-lru】所有设置过期的key,优先删除最少使用的key4.【allkeys-random】所有key通用,随机删除一部分key5.【volatile-random】所有设置过期的key,随机删除一部分key6.【volatile-ttl】所有设置过期的key,删除剩余时间(Time to live)最少的key【三种删

2021-06-08 20:51:05 12

原创 缓存行、伪共享

缓存行:CPU每次从主存中拉取数据时,不会只读取目标数据,而是会把相邻的数据一起读出来,存在一个缓存行上,大小一般是64字节。当缓存行的数据被修改时,会重新去主存拉取新的缓存行。public class CacheLineEffect { //考虑一般缓存行大小是64字节,一个 long 类型占8字节 static long[][] arr; public static void main(String[] args) { arr = new long[1024

2021-06-08 20:21:55 2

原创 Idea 想下载类的源码时,报错:Cannot download Sources解决方法

进入到项目根路径后 使用mvn dependency:resolve -Dclassifier=sources

2021-06-04 15:37:50 26

原创 Java CompletableFuture

先上一段示例代码,业务上是并行访问多个不同服务的查询,并汇总查询结果。这里简单写个样例:public static void main(String[] args) throws Exception { // 通过线程安全的CopyOnWriteArrayList来汇总各线程执行方法的返回值 CopyOnWriteArrayList result = new CopyOnWriteArrayList(); List<CompletableFuture&

2021-06-04 15:34:54 4

原创 JAVA NIO的allowcate(非直接缓冲区)与allocateDirect(直接缓冲区)的区别

DirectByteBuffer操作的缓冲区是【allowcate非直接缓冲区】分配在jvm堆中(java字节数组)HeapByteBuffer操作的缓冲区是【allocateDirect直接缓冲区】分配在堆外操作系统本地(c、c++的数组)【HeapByteBuffer与DirectByteBuffer的区别】1.创建的效率:由于DirectByteBuffer操作的缓冲区是通过操作系统本地代码创建的,对于java来说创建和销毁DirectByteBuffer更消耗性能而HeapByteBuffe

2021-06-03 22:02:55 4

原创 Java ReentrantLock源码解读

ReentrantLock支持公平和非公平锁,对应源码就是有两个内部实现类分别是:非公平:/** * Sync object for non-fair locks */static final class NonfairSync extends Sync { ...}公平:/** * Sync object for fair locks */static final class FairSync extends Sync { ...}通过ReentrantLoc

2021-06-03 21:33:22 18 2

原创 Java 观察者模式

观察者模式:如果对象之间存在一对多关系,当一个对象改变状态,依赖它的多个对象会收到通知并更新自己。自己实现:被观察者:抽象主题+具体主题/** * 抽象主题接口(被观察者) */public interface Subject { // 增加观察者 void addObserver(Observer observer); // 删除观察者 void deleteObserver(Observer observer); // 通知所有观察者 v

2021-05-31 23:11:25 2

原创 Java 装饰模式

装饰模式:在不影响原有对象的情况下,动态地、无入侵地给一个对象添加额外的方法套娃,里面还是那个对象,外面套方法构成:1.接口2.实现接口的实现类(被装饰的对象)3.装饰角色(同样实现接口)4.具体的装饰(装饰角色的子类)举例:1.接口public interface MilkTea { public String getName(); public int getPrice();}2.被装饰的对象public class PearMilkTea implemen

2021-05-31 22:16:35 1

原创 Java 逃逸分析

【什么是逃逸分析】Java Hotspot 虚拟机可以分析新创建对象的使用范围,并决定是否在Java堆上分配内存的一项技术。没逃逸的出存栈,逃逸存堆。【对象逃逸状态】1.全局逃逸(GlobalEscape)一个对象的作用范围逃出了当前方法或者当前线程:#1 对象是一个静态变量#2 对象是一个已经发生逃逸的对象#3 对象作为当前方法的返回值2.参数逃逸(ArgEscape)即一个对象被作为方法参数传递或者被参数引用,但在调用过程中不会发生全局逃逸,这个状态是通过被调方法的字节码确定的。3.

2021-05-28 17:37:13 5

原创 Java 父线程与子线程相互通信的方法

情况1:父线程结束,子线程跟着结束方法:将子线程设置为父线程的守护线程即可,当主线程结束时,子线程自动结束。情况2:父线程等子线程结束方法1:最朴素的方法,while(子.isAlive==true) 蠢方法2:子.join()方法3:CountDownLatch cdl=new CountDownLatch(1);父 cdl.await();子 cdl.countDown();方法4:阻塞队列 BlockingQueue queue = new ArrayBlockingQueue(1);

2021-05-28 17:13:24 9

原创 Java Callable、Future、FutureTask

通过它们可以在任务执行完毕之后得到任务执行结果【Callable】继承Callable接口,实现call()方法,可以有【返回值】!class C implements Callable{ @Override public String call() throws Exception { return "hhhhh"; }}【Future】Future就是对于具体的Runnable或者Callable任务的执行结果进行取消、查询是否完成、获取结果。必要

2021-05-27 21:42:08 3

原创 Java assert断言

首先,jvm默认不开启断言,手动开启断言需要添加命令-ea其次,调试使用,正常业务下不要使用断言的使用:assert [判断T/F] 如果True就继续执行,False则终止抛异常@Testpublic void tt(){ assert false; System.out.println("aaa");}assert [判断T/F] : [抛出的异常信息]@Testpublic void tt(){ assert false : "我是异常信息";

2021-05-27 21:38:43 6

原创 Redis 事物

注意:redis的事物与数据库的事物不同,如果一条语句出错,其他语句会正常执行!!!Redis事物使用主要依赖以下5条命令:1.watch:监听一个或多个key,如果事物期间key被其他客户端修改了则事物就会终止2.unwatch:取消监听3.multi:开始事物4.exec:提交事物5.discard:放弃事物jedis使用事物jedis.watch("k1");Transaction transaction=jedis.multi();// 执行自己的方法transaction.s

2021-05-26 14:30:57 5

原创 Java Exchanger

Exchanger用于两个工作线程之间交换数据线程A与线程B交换数据,当线程到达交换点直接交换,另一个等待的A线程立即被唤醒,而不是等B线程执行完再唤醒public class test03 { public static void main(String[] args) { Exchanger<Integer> exchanger=new Exchanger<>(); Thread t1=new Thread(new A(exchange

2021-05-26 14:14:25 1

原创 Java LockSupport

使用:1.阻塞当前线程(LockSupport.park())2.已经唤醒指定被阻塞的线程(LockSupport.unpark(XX线程对象))被park()的状态是WAITING实现原理:每个线程都有一个许可(permit),permit只有两个值1和0,默认是0。1.当调用unpark(thread)方法,就会将thread线程的许可permit设置成1(注意多次调用unpark方法,不会累加,permit值还是1)。2.当调用park()方法,如果当前线程的permit是1,那么将pe

2021-05-26 14:08:44 2

原创 Java shutDown()与shutdownNow()

【shutdown】只是将线程池的状态设置为SHUTWDOWN状态,此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。 (当前正在执行的不停止,队列中的任务也会继续等待执行,只是不让添加任务到队列中,空闲的线程会异步中断)【shutdownNow】则是将线程池的状态设置为STOP,正在执行的任务则被停止,没被执行任务的则返回。它试图终止线程的方法是通过调用Thread.

2021-05-26 14:02:05 2

原创 Redis 分布式锁

@Testpublic void test11(){ jedis.select(1); SetParams setParams=new SetParams(); setParams.nx().ex(100); String result=jedis.set("c","b",setParams); System.out.println(result);}成功存入表示锁不存在返回OK,失败表示锁存在返回null,key存在即存在nx:如果不存在则写入xx:如果

2021-05-24 22:07:35 4

原创 数据库 char、varchar、text的区别

长度【char】是定长,长度不足空格【后补齐】。适合固定长度字段和频繁变更的字端。相比varchar要计算长度,char要省掉计算长度的时间。【varchar】有最大长度限制,但不定长,需要占用一个byte存储信息长度;【text】不设置长度查询速度【char】最快 【varchar】其次 【text】最慢大小【char】char(n)中的n表示字符数,最大长度是255个字符; 如果是utf8编码方式, 那么char类型占255 * 3个字节。(utf8下一个字符占用1至3个字节)【var.

2021-05-24 21:54:23 9 1

原创 JPA 二级缓存

一级缓存:session级别,同一次session,同sql只执行一次,调用多次走一级缓存注意:要开启事物或者手动维护一次session才会有一级缓存!!并且jps的find之类的方法不是,只有通过EntityManager执行的sql才会有一级缓存比如:// 一级缓存不生 效@Test@Transactionalpublic void t1() { userDao.findAll(); userDao.findAll(); userDao.findAll();}

2021-05-15 14:09:15 14

原创 Redis 数据类型

String(字符串)string是redis最基本的类型,一个key对应一个valuestring类型是二进制安全的意思是redis的string可以包含任何数据 比如jpg图片或者序列化的对象一个键最大能存储512MB使用:@Testpublic void test01(){ redisTemplate.opsForValue().set("aaa","bbb"); System.out.println(redisTemplate.opsForValue().get("a.

2021-05-13 23:40:36 36

原创 Sql 执行insert语句返回插入数据的信息

使用关键字returning column例如:插入一条数据并返回插入数据的idINSERT INTO database (column1,..) VALUES (value1,...) RETURNING id

2021-05-13 22:43:10 27

原创 JDK1.7前后 intern()方法的变动

1.6以前版本intern():如果常量池没有这个字符串,则将这个字符串加入到常量池String s1=new StringBuilder("什").append("么").toString();// trueSystem.out.println(s1==s1.intern());String s2=new StringBuilder("什么").toString();// trueSystem.out.println(s2==s2.intern());1.7以后版本intern():如果常

2021-05-13 22:19:28 7

原创 JVM 垃圾回收器

Serial收集器【年轻代】收集器【串行】收集器回收算法:复制单线程工作的收集器,单线程强调的是在Serial进行GC时,会Stop The World,必须暂停其他工作线程(程序到达Safepoint)JDK9前可以与CMS和Serial Old搭配JDK9后只能与Serial Old搭配Serial Old收集器【老年代】收集器【串行】收集器回收算法:标记-整理JDK9前可以和Serial、ParNew、Parallel Scavenge收集器搭配JDK9后不再与ParN..

2021-05-12 19:51:41 4

原创 Maven 配置多个远程仓库

【方式一】:全局多仓库设置配置maven的settings.xml文件去掉原来的仓库<mirror><mirror/>改用<profiles><profiles/><profiles> <profile> <!-- id必须唯一 --> <id>myRepository1</id> <repositories>

2021-05-12 19:23:26 57

原创 Java 从源码的角度去分析:为什么建议手动创建线程池

提供的有四种线程池:Executors.newFixedThreadPool()、Executors.newSingleThreadExecutor()、Executors.newCachedThreadPool()、Executors.newScheduledThreadPool()两两为例,从源码的角度去分析这些线程池有什么问题:第一组Executors.newFixedThreadPool()和Executors.newSingleThreadExecutor()Executors.newFix

2020-12-31 10:59:07 48

原创 SpringBoot logging.level报错

报错信息如下:org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under ‘logging.level’ to java.util.Map<java.lang.String, org.springframework.boot.logging.LogLevel>原因是logging.level需要指定日志覆盖的范围,如果直接配置为:logging.level=de

2020-12-07 17:33:18 717

原创 Java 三目运算符空指针问题

三目运算符的第二位或者第三位参数如果存在基本类型会进行自动拆包,例如Long类型 Long类型拆包实质是调用Long.ValueOf()方法,如果是null值就会报空指针问题,如果两个参数都是非基本类型,就不会出现问题Object o=null;Long ds=null;Long cc=ds;Long c=o==null?ds:cc;不会报错,因为都是包装类Object o=null;Long ds=null;long cc=ds;Long c=o==null?ds:cc;会报错,

2020-12-06 21:24:54 53

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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