- 博客(21)
- 收藏
- 关注
原创 Java IdentityHashMap与HashMap的区别
判断key是否相等的方式不同,具体看代码:public class IdentityHashMapT { public static void main(String[] args) { String s1="aaa"; String s2="aaa"; String s3=new String("aaa"); // true System.out.println(s1==s2); // false
2021-06-25 17:13:44 124
原创 Java 类加载器
类加载器根据一个类的全限定名来读取此类的二进制字节流到JVM中,然后转换为java.lang.Class对象实例,在虚拟机提供了3种类加载器:引导(Bootstrap)类加载器(启动类加载器)、扩展(Extension)类加载器、系统(System)类加载器(应用类加载器)。【启动(Bootstrap)类加载器】启动类加载器主要加载的是JVM自身需要的类,这个类加载使用C++语言实现的,是虚拟机自身的一部分,它负责将<JAVA_HOME>/lib路径下的核心类库或-Xbootclassp
2021-06-20 18:08:03 71
原创 Java 四种引用类型及应用场景
强引用:Java中默认声明的就是强引用。只要强引用存在,JVM永远不会回收。//只要obj还指向Object对象,Object对象就不会被回收Object obj = new Object(); //手动置nullobj = null; 软引用:可以当成缓存使用,只有在内存不足的时候才会回收。弱引用:只要进行垃圾回收就会被回收。WeakHashMap,ThreadLocal中应用。虚引用:在回收时得到通知。Nio通过它来实现对直接内存的释放。...
2021-06-17 19:50:07 254
原创 SpringBoot @Scheduled 执行两次的问题
网上有各种说是Tomcat的解决方法,这些并不能解决我的问题。我的情况是这样的:我在写定时任务的时候,想通过配置文件的值来控制是否执行定时任务,于是有了以下的代码:@Configurationpublic class ScheduledConfig{ @ConditionalOnProperty(prefix="scheduled",value="enable",havingValue="true") @Bean public ScheduledAnnotationBeanPostPr
2021-06-16 16:40:49 2717 1
原创 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 523
原创 Java ExecutorService的execute方法和submit方法的区别
execute:提交后如果线程运行后,和主线程就脱离了关系了。当线程的执行过程中抛出了异常,主线程无法获取到异常的信息。submit:线程执行过程中,出现异常,主线程会得到异常直接使用submit,异常也不会显示可以通过sumbit返回Future对象,根据Future.get进行异常捕获...
2021-06-15 15:46:06 1345 1
原创 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 1243 1
原创 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 113
原创 Java 读写锁
总结了一下Java的读写锁实现ReadWriteLock最简单的就是【ReentrantReadWriteLock】,但是有一个潜在的问题:如果有线程正在读,写线程需要等待读线程释放锁后才能获取写锁,即读的过程中不允许写,这是一种【悲观锁】。StampedLock为了提高效率,jdk1.8引入了新的读写锁【StampedLock】:读的过程中也允许获取写锁后写入!这样一来,我们读的数据就可能不一致,所以,需要一点额外的代码来判断读的过程中是否有写入,这种读锁是一种【乐观锁】。是不可重入锁。验
2021-06-14 22:07:30 1618 1
原创 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 70
原创 Java 高性能队列Disruptor
在Disruptor中,生产者不断生产数据,并将数据持续放入一个环形缓冲区RingBuffer中。消费者通过onEvent()方法监听RingBuffer,当生产者向RingBuffer中添加数据时(publish),会触发消费者的onEvent()方法并发传递数据对象,生产和消费的数据对象@Datapublic class DataEvent { private String value;}生产数据的工厂类,生产者没有创建对象只是拿到缓存区的对象赋值,数据对象是缓冲区创建的publi
2021-06-09 16:47:54 568
原创 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 1663
原创 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 4051
原创 PostgreSQL 关闭session链接
删库删不掉因为还有链接没有释放。释放sql: SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='数据库名';
2021-06-09 15:45:43 1087
原创 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 241
原创 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 1750
原创 缓存行、伪共享
缓存行: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 164
原创 Idea 想下载类的源码时,报错:Cannot download Sources解决方法
进入到项目根路径后 使用mvn dependency:resolve -Dclassifier=sources
2021-06-04 15:37:50 321
原创 Java CompletableFuture
先上一段示例代码,业务上是并行访问多个不同服务的查询,并汇总查询结果。这里简单写个样例:public static void main(String[] args) throws Exception { // 通过线程安全的CopyOnWriteArrayList来汇总各线程执行方法的返回值 CopyOnWriteArrayList result = new CopyOnWriteArrayList(); List<CompletableFuture&
2021-06-04 15:34:54 189
原创 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 364 1
原创 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 85 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人