JAVA
文章平均质量分 79
代码最诚实的朋友
用眼和脑能看到和想到的未来是基于大数据的人工智能,但是仍然不要忘了我们最爱的源代码,最爱的算法和数据结构,还有遥遥不可及的数学
展开
-
Java基础
创建一个单例Effective Java作者Josh Bloch 提倡使用枚举的方式。枚举写法简单public enum EasySingleton{ INSTANCE;}你可以通过EasySingleton.INSTANCE来访问。枚举自己处理序列化我们知道,以前的所有的单例模式都有一个比较大的问题,就是一旦实现了Serializable接口之后,就不再是单例的了,因为,每次调用 readObject()方法返回的都是一个新创建出来的对象,有一种解决办法就是使用readReso原创 2022-02-16 00:39:25 · 124 阅读 · 0 评论 -
mybatis与spring boot的集成
前言MyBatis提供了整合到 Spring Boot 的方案 mybatis-spring-boot-starter,能够让你快速的在 Spring Boot 上面使用 MyBatis,那么我们来看看这个 mybatis-spring-boot-starter 是如何将 MyBatis 集成到 Spring Boot中的。mybatis的自动装配引入mybatis-spring-boot-starter包。 <dependency> <groupI原创 2022-01-24 22:21:45 · 4736 阅读 · 2 评论 -
记一次jvm性能调优
背景项目的海外版本,已经有两年没有更新了,目前需要更新到最新版本,申请资源时,已经没有当前使用的4C8G服务器资源了,只有2C4G的服务器了,当前每台服务器的qps有1500左右,看cpu也只使用了5%的样子,虽然新版本增加了不少功能,就算资源缩一半,看起来也是可行的。实际情况单独拉了一个分组,新版本先上了一台,观察了一天,日志没发现啥问题,便继续挂上其他机器,跑了一会,收到性能报警,max有超过1s的情况,看老版本的max,毛刺也很多,但没超过1s的情况。性能较好的是老版本,新版本明显原创 2022-01-21 16:37:30 · 1221 阅读 · 0 评论 -
spring boot线程池的正确使用方式
spring boot自动装配自动装配是spring boot的一大特点,自动装配其实就是spring把一些常用的bean提前注册到了容器,如redis、jdbc、activemq等,我们可以直接来使用这些bean,所有的自动装配的代码都在spring-boot-autoconfigure这个模块里。内置了很多,市面上常用的组件基本都包括了。线程池的自动装配线程池的自动装配代码在org.springframework.boot.autoconfigure.task.TaskExecuti原创 2022-01-19 17:57:17 · 5143 阅读 · 2 评论 -
java动态线程池
java线程池Java标准库提供了java.util.concurrent.ExecutorService接口表示线程池,并提供了几个实现,通过java.util.concurrent.Executors类提供的方法可以创建线程池,例如:FixedThreadPool:线程数固定的线程池; CachedThreadPool:线程数根据任务动态调整的线程池; SingleThreadExecutor:仅单线程执行的线程池。以上都有其局限性,不够灵活;另外这几种方法内部也是通过java.util.原创 2022-01-17 21:53:10 · 454 阅读 · 0 评论 -
java集锦
spring加载过程spring主要是用来管理bean的,spring的加载过程,也就是bean的加载过程,ApplicationContext和BeanFacotry都是用于加载bean的,ApplicationContext提供了更多的扩展功能,BeanFacotry是ApplicationContext的其中一个环节,具体过程如下:读取配置文件、解析配置文件、注册bean、获取bean(单例bean会先从缓存加载,没有就实例化一个)spring循环依赖获取bean的过程是最复杂的,其中就原创 2022-01-11 23:54:57 · 265 阅读 · 0 评论 -
log4j2谨慎使用位置信息
原文引用:If one of the layouts is configured with a location-related attribute like HTML locationInfo, or one of the patterns %C or %class, %F or %file, %l or %location, %L or %line, %M or %method, Log4j will take a snapshot of the stack, and walk the stack原创 2021-06-10 17:00:01 · 329 阅读 · 0 评论 -
stream和lambda的一些场景用法
场景一:对集合的去重聚合操作List<String> ips = Lists.newArrayList("10.194.39.102_6408","10.194.39.110_6406","10.194.39.110_6407");//对集合按ip分组,并将同一个ip的端口聚合Map<String, String> result = ips.stream().collect(Collectors.toMap(ip -> ip.split("_")[0],原创 2021-01-02 17:55:28 · 162 阅读 · 0 评论 -
Intellij IDEA 一些不为人知的技巧
idea+git=perfect转载 2017-01-17 20:52:13 · 1963 阅读 · 1 评论 -
深入理解Java:SimpleDateFormat安全的时间格式化
想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法应该使用同步代码来避免问题。下面我们通过一转载 2017-02-08 11:17:16 · 297 阅读 · 0 评论 -
Java HashMap的hash算法
HashMap 中hash table 定位算法: Java代码 int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); 其中indexFor和hash源码如下: Java代码 /** * Applies a supplemen转载 2016-08-25 10:22:07 · 1277 阅读 · 1 评论 -
Java HashMap的hash函数实现
Hashmap是一种非常常用的、应用广泛的数据类型,最近研究到相关的内容,就正好复习一下。网上关于hashmap的文章很多,但到底是自己学习的总结,就发出来跟大家一起分享,一起讨论。 1、hashmap的数据结构 要知道hashmap是什么,首先要搞清楚它的数据结构,在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构转载 2016-08-25 10:15:55 · 2188 阅读 · 0 评论 -
Java ReentrantLock(重入锁)带来的改变
前言ReentrantLock称为重入锁,它比内部锁synchronized拥有更强大的功能,它可中断、可定时,JDK5中,在高并发的情况下,它比synchronized有明显的性能优势,在JDK6中由于jvm的优化,两者差别不是很大。synchronized原语和ReentrantLock在一般情况下没有什么区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,特别原创 2016-08-24 11:03:32 · 468 阅读 · 0 评论 -
JVM调优(四)常用调优方案
将新对象预留到新生代由于Full GC的成本要远远高于Minor GC,因此尽可能的将对象分配在新生代是一项明智的选择。 大部分情况下,jvm会尝试在eden区域分配对象,但是因为空间紧张等问题,很可能不得不将部分年轻对象提前向老年代压缩。因此,可以为程序分配一个合理的新生代空间,以最大限度避免新对象直接进入老年代的情况。一般来说,当survivor区的空间不够,或者占用量达到50%时原创 2016-08-23 10:37:46 · 510 阅读 · 0 评论 -
RMI(Remote Method Invocation)原理浅析
现代的 网络和编程技术,让我们的资源共享从信息逐步迈向了硬件,你想到过吗?你可以把一个解密的任务放到远程的运行更快的,闲置的服务器上进行,最后把运算的结果返回来,你 所要做的就是提交任务。看到了吧,处理这些任务是远程的服务器。Java的RMI的技术让这种实现变得非常的容易,本文就从基础性的东西讲解一下RMI的原理,有关安全和部署的问题,本文不加于讨论。 读过本文希望对你的学习有所帮助。转载 2015-05-20 12:33:36 · 1077 阅读 · 0 评论 -
dubbo是如何“插入”到spring框架中的
作为一个分布式服务治理框架,dubbo做的非常好,在业界使用很广,所以最近研究了下这个框架。任何框架要研究其原理最好的办法之一就是沿着其运行流程进行追踪,这样就能从上到下,从粗到细对一个系统进行了解。今天,我们要说明的问题就是dubbo如何启动的。 dubbo是基于Spring进行开发的,而且扩展了Spring的XML schema和注解标签,其实这里也就是整个dubbo的切转载 2015-09-21 11:28:38 · 469 阅读 · 0 评论 -
java中treemap和treeset实现(红黑树)
treemap是基于红黑树实现的,红黑树在二叉树中的关系如下:最早的二叉检索树,又叫二叉排序树,为了保证二叉排序树的平衡性,因为数的深度越大,检索越慢,所以产生了平衡二叉树,也就是avl树,平衡二叉树是一颗高度平衡的二叉排序树,获得了较高的查找性能,红黑树就是在这个时候出现的,红黑树与平衡二叉树的区别是,红黑树追求的是局部的平衡,复杂度得到大大降低,性能更好,自从红黑树出现,平衡二叉树便慢慢应用的少了。。。。。。转载 2016-07-08 09:01:12 · 679 阅读 · 0 评论 -
关于volatile和cas
cas描述:CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。这个旧的预期值是什么意思?V是内存值,B是要程序即将要存入内存的值,但这个旧的预期值A,是什么意思,程序如何知道预期值?一个线程间共享的变量,首先在主存中会保留一份,然后每个线程的工作内存也会保留一份副本。这里说的预期值,就是线程保留的副本。当该原创 2016-08-18 14:16:55 · 1491 阅读 · 0 评论 -
关于io和nio
nio的机制可以让cpu的工作更饱和,更有效率。。。原创 2016-09-12 11:27:03 · 386 阅读 · 0 评论 -
Java NIO类库Selector机制解析
非常不错的从操作系统级别来介绍nio Selector机制转载 2016-09-12 16:55:06 · 342 阅读 · 0 评论 -
JVM调优(一)虚拟机的内存模型
Java字节码是运行在JVM虚拟机上的,同样的字节码使用不同的JVM参数运行,其性能表现可能各不一样。原创 2016-08-22 10:14:27 · 515 阅读 · 0 评论 -
JVM调优(二)JVM内存分配参数
设置最大堆内存-Xmx参数指定。最大堆是新生代和老年代的大小之和的最大值,他是java应用程序的堆上限。使用-Xmx可以设置系统的最大堆。设置最小堆内存使用-Xms可以设置系统的最小堆空间,也就是jvm启动时,所占据的操作系统的内存大小。设置新生代设置持久代设置线程栈原创 2016-08-22 16:29:12 · 387 阅读 · 0 评论 -
JVM调优(三)垃圾收集
前言垃圾收集器要处理的基本问题是:哪些对象需要回收?何时回收这些对象?如何回收这些对象?回收算法复制算法(copying)标记-压缩算法(mark-compact)原创 2016-08-22 17:22:59 · 276 阅读 · 0 评论