Java
Java
Jitwxs
关注 https://jitwxs.cn,看最新首发文章
展开
-
如何优雅的统计代码耗时
一、前言代码耗时统计在日常开发中算是一个十分常见的需求,特别是在需要找出代码性能瓶颈时。可能也是受限于 Java 的语言特性,总觉得代码写起来不够优雅,大量的耗时统计代码,干扰了业务逻辑。特别是开发功能的时候,有个感受就是刚刚开发完代码很清爽优雅,结果加了一大堆辅助代码后,整个代码就变得臃肿了,自己看着都挺难受。因此总想着能不能把这块写的更优雅一点,今天本文就尝试探讨下“代码耗时统计”这一块。在开始正文前,先说下前提,“代码耗时统计”的并不是某个方法的耗时,而是任意代码段之间的耗时。这个代码段,可能是原创 2020-10-24 12:57:14 · 1634 阅读 · 2 评论 -
Java 浅拷贝性能比较
一、前言实际开发中,经常会遇到对象拷贝的需求,本文就结合日常开发过程中,使用到的浅拷贝技术,进行性能比较,看看谁更强。重要: 下面将会花大量篇幅,列出各种类型浅拷贝的代码,你可以直接拖到文章末尾,看性能对比结果。然后再根据你中意的对象回过头来看它的代码,避免疲劳。源码链接:https://github.com/jitwxs/blog-sample/tree/master/SpringBoot/shallow_copy首先创建一个用于拷贝的 Bean,如下所示:import lombok.Al原创 2020-09-20 20:37:46 · 899 阅读 · 0 评论 -
Lombok 子类如何使用 @Builder
一、前言业务开发中,子类父类还算是经常用到,Lombok 的 @builder 提供的链式调用帮助我们更轻松的创建对象。但是实验后却发现子类的 @Builder 是不会包含父类的属性。假设存在父类 A:@Data@Builderpublic class A { private String aName; private String aAge;}存在子类 B:@Builder@Data@EqualsAndHashCode(callSuper = true)publi原创 2020-09-06 10:49:04 · 3161 阅读 · 0 评论 -
Java Fail-Fast 与 Fail-Safe 特性
一、前言在 Java 的集合结构中,如果我们同时进行遍历(for-each, iterator)和集合修改(add, set, remove…)操作时,就有可能发生异常。例如,线程 T1 在对集合进行遍历,而此时线程 T2 对集合进行添加元素;亦或者线程 T1 在对集合进行遍历的过程中,进行删除元素操作。不同的集合在遇到上述这种情况时,会有不同的处理。按照处理的不同,划分为 Fail-Fast 和 Non-Fail-Fast(下文统称为 Fail-Safe)两类。前者不允许在迭代的过程中对集合进行增删操原创 2020-08-23 00:11:30 · 880 阅读 · 0 评论 -
Java 代码性能优化之路
一、前言最近一直忙着参与公司的新项目开发,由于临期上线,正在对系统进行性能压测,在这个过程中,发现一些代码有性能优化的空间。因此决定写一篇文章,把本次以及今后,遇到的性能优化的 case 都记录下来,希望对大家们的编码水平能够有所帮助。源码链接:https://github.com/jitwxs/blog-sample/blob/master/Java/performance_optimized二、Java 基础2.1 字符串拼接在我们的系统中,存在着大量的缓存,这些缓存的 key 值根据请求原创 2020-05-23 21:07:41 · 750 阅读 · 0 评论 -
首次排查 OOM 实录
一、前言距离上篇文章更新已经一月有余,之所以一直没更新一是工作最近比较忙,二是感觉产出不了什么对自己和他人有价值的文章。因此这段时间,主要的空闲时间在学习技术和写 GitHub,博客这边就暂时落下了。本篇文章的落成更像是一篇笔记,而不是博客。因为在一年的工作后,首次碰上了 OOM 问题,虽然导致的原因比较简单,但也算是值得纪念的,哈哈。二、问题复现代码源码:https://github....原创 2020-05-02 20:47:50 · 672 阅读 · 2 评论 -
高性能 Disruptor——消除伪共享
一、CPU Cache存储设备往往是速度越快价格越昂贵,速度越快价格越低廉。在计算机中,CPU 的速度远高于主存的速度,而主存的速度又远高于磁盘的速度。为了解决不同存储部件的速度不对等问题,让高速设备充分发挥性能,引入了多级缓存机制。为了解决内存和 CPU 的速度不匹配问题,相继引入了 L1 Cache、L2 Cache、L3 Cache,数字越小,容量越小,速度越快,位置越接近 CPU。...原创 2020-04-19 11:10:08 · 2200 阅读 · 0 评论 -
Java 并发编程——线程池的异常处理机制
一、前言1.1 文章起因这篇文章的起因来源于一个 BUG,这个 BUG 和上篇文章《Java SynchronizedSet 线程不安全之坑》 有点关系。简单来说,就是在线程池中执行任务,任务本身未做异常处理,导致出现异常后任务停止。出错的原因来自对 Collections.synchronizedSet(new HashSet<>()) 的线程不安全访问,抛出了 Concurr...原创 2020-04-06 00:34:38 · 1365 阅读 · 1 评论 -
Java SynchronizedSet 线程不安全之坑
一、前言一般而言,想要构造出线程安全的 Set,我们会使用 Collections.synchronizedSet 方法,如下所示。Set<User> set = Collections.synchronizedSet(new HashSet<>());但这并不意味着,你可以安全的使用该集合的任何方法,如果没有仔细的了解过其实现的话,一不小心就会踩进坑中。最近我在...原创 2020-03-01 13:54:49 · 3595 阅读 · 0 评论 -
Parallel Stream 的错误实践
一、前言Java8 Stream 流的出现,极大的简化了业务需求中对集合数据的加工处理操作。虽然好用,但是一旦使用不当,也会带来意想不到的结果,本文记录使用 Parallel Stream 的错误实践。List<Object> sourceList = ...;List<Object> list = new ArrayList();sourceList.strea...原创 2020-02-22 13:06:36 · 1457 阅读 · 0 评论 -
Google Jib 容器化构建工具
一、前言随着近些年的技术发展,Java 领域微服务已经成为主流的技术方向。随着微服务化,云原生的概念也逐渐火热起来,不了解云原生仿佛就是一个原始人。而在云原生中,应用容器化 是其核心属性之一。应用容器化,用抽象的话来说就是:将软件容器中的应用程序和进程作为独立的应用程序部署单元运行,并作为实现高级别资源隔离的机制。从总体上改进开发者的体验、促进代码和组件重用,而且要为云原生应用简化运维工作。通...原创 2019-12-19 00:07:14 · 1636 阅读 · 0 评论 -
Disruptor:一种高性能的、在并发线程间数据交换领域用于替换有界限队列的方案
一、摘要LMAX 计划创建一个高性能的财务交易系统。作为我们工作的一部分,我们评估了多种方案去设计这个系统以求达到高性能目标,最后我们发现在传统的解决方案中遇到了基础上的瓶颈。许多应用程序通过队列来在不同的处理阶段之间交换数据。我们的性能测试显示,如果按照传统的方式来使用队列,延时代价的量级和磁盘 IO 操作的延时量级是同一个量级——非常慢。如果在端到端的操作中采用多个队列,又会增加了几百个毫...翻译 2019-12-13 00:58:47 · 859 阅读 · 3 评论 -
Java 并发编程——CyclicBarrier
一、简介CyclicBarrier 是一个同步工具类,它允许一组线程在到达某个栅栏点(common barrier point)互相等待,发生阻塞,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行.它非常适用于一组线程之间必需经常互相等待的情况。CyclicBarrier 字面理解是循环的栅栏,之所以称之为循环的是因为在等待线程释放后,该栅栏还可以复用。建议阅读 Cy...原创 2019-11-25 20:38:00 · 416 阅读 · 0 评论 -
Java实现指定数据表导出生成Excel
1. 前言: 在开发过程中往往少不了自动生成excel,比如学校教务系统,医疗系统,公司财务或者是公司员工的工资预览表都会使用。2. 准备阶段: 1、Java开发环境 2、所需要的jar包: (1)MySQL-connector-java-5.1.12-bin.jar (2)poi-3.17-beta1.jar这里提供了相关的jar包链接: 链接:http://p转载 2017-08-23 11:53:39 · 754 阅读 · 0 评论 -
什么时候使用 CountDownLatch
正如每个Java文档所描述的那样,CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。在 Java 并发中,countdownlatch 的概念是一个常见的面试题,所以一定要确保你很好的理解了它。一、CountDownLatch 是什么?CountDownLatch 是在 java1.5 被引入的,跟它一起被引入的并发工具类还有 Cy...转载 2019-02-26 22:09:47 · 218 阅读 · 0 评论 -
String hashCode 方法为什么选择数字31作为乘子
一、背景某天,我在写代码的时候,无意中点开了 String hashCode 方法。然后大致看了一下 hashCode 的实现,发现并不是很复杂。但是我从源码中发现了一个奇怪的数字,也就是本文的主角31。这个数字居然不是用常量声明的,所以没法从字面意思上推断这个数字的用途。后来带着疑问和好奇心,到网上去找资料查询一下。在看完资料后,默默的感叹了一句,原来是这样啊。那么到底是哪样呢?在接下来章节里...转载 2019-04-26 16:16:58 · 478 阅读 · 0 评论 -
Java Switch 是如何支持 String 的,为什么不支持 long?
我们知道 Java Switch 支持byte、short、int 类型,在 JDK 1.5 时,支持了枚举类型,在 JDK 1.7 时,又支持了 String类型。那么它为什么就不能支持 long 类型呢,明明它跟 byte、short、int 一样都是数值型,它又是咋支持 String 类型的呢?一、结论不卖关子,先说结论:switch 底层是使用 int 型 来进行判断的,即使是枚举、...原创 2019-04-26 18:23:31 · 4847 阅读 · 0 评论 -
详解 Guava Cache
一、Guava Cache一般在项目中,本地缓存的实现为 ConcurrentHashMap,它具有线程安全、持久有效的特点。但是相较于传统缓存,它不具备缓存过期、缓存移除等特性,Google Guava 包内的 Cache 模块可能会给你一个新的选择。Guava 目前托管于 GitHub,在项目中引入也是十分简单:<dependency> <groupId>...原创 2019-04-19 17:00:50 · 2414 阅读 · 0 评论 -
理解 BigDecimal 的 RoundingMode
在金融等对数据精度计算要求较高的领域,传统 double 运算无法满足要求, BigDecimal 类应运而生。实际使用中,RoundingMode 这个枚举类控制着小数的舍位原则,本文对该枚举类进行介绍。一、RoundingMode.DOWN等价枚举: BigDecimal.ROUND_DOWN舍位原则: 粗暴截断舍弃位,不考虑任何进位舍位操作例: Scale = 2Origin:3....原创 2019-05-08 21:01:41 · 12063 阅读 · 0 评论 -
Java 设计模式——观察者模式
一、前言好久没更新设计模式系列了,这周闲来无事,就水一把,介绍个简单的——观察者模式。所谓观察者模式,本质是就是发布与订阅,在日常生活中发布/订阅的例子有很多,比如大家微信里面的公众号,你可以订阅微信公众号,公众号发布文章后,微信会将文章推送给你。。。二、发布 / 订阅在上面提到的公众号的例子,就是一个观察者模式。你作为一名普通用户就是观察者,你可以关注或者取关公众号,当公众号发布消息时...原创 2019-06-28 10:06:36 · 380 阅读 · 1 评论 -
Java 并发编程——ReentrantLock
一、简介ReentrantLock 是一个可重入且独占式的锁,相较于传统的 Synchronized,它增加了轮询、超时、中断等高级功能。其类图如下:[外链图片转存失败(img-3M1j3YcP-1569170523799)(/images/posts/20190806224334764.png)]ReentrantLock 是 java.util.concurrent(J.U.C)包中的锁...原创 2019-09-23 00:44:52 · 414 阅读 · 0 评论 -
Java 并发编程——CountdownLatch
一、前言今天来介绍下 concurrent 包下的一个工具类——CountDownLatch,这算是一个比较实用的工具类,在我们日常开发中使用的比较多,而且 API 也很简单,总结记录下。注:本文的源码浅析章节参考文章:《CountDownLatch详解》二、基本使用CountdownLatch 的主要功能是允许一个或多个线程等待直到在其他线程中一组操作执行完成,用人话说就是多个线程分...原创 2019-09-23 16:53:11 · 436 阅读 · 0 评论 -
如何判断一个元素在亿级数据中是否存在?
转载于:如何判断一个元素在亿级数据中是否存在?前言最近有朋友问我这么一个面试题目:现在有一个非常庞大的数据,假设全是 int 类型。现在我给你一个数,你需要告诉我它是否存在其中(尽量高效)。需求其实很清晰,只是要判断一个数据是否存在即可。但这里有一个比较重要的前提:非常庞大的数据。常规实现先不考虑这个条件,我们脑海中出现的第一种方案是什么?我想大多数想到的都是用 HashMa...转载 2018-11-28 19:48:17 · 847 阅读 · 1 评论 -
Java并发编程——线程池的使用
转载于:Java并发编程:线程池的使用本文基于JDK 1.6,在高版本JDK中源码有所出入一、Java中的ThreadPoolExecutor类java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类,因此如果要透彻地了解Java中的线程池,必须先了解这个类。下面我们来看一下ThreadPoolExecutor类的具体实现源码。在Thre...转载 2018-09-27 19:42:50 · 573 阅读 · 0 评论 -
JDK动态代理与Cglib动态代理
AOP(Aspect Oriented Programming),即面向切面编程,最主要的思想就是纵向重复,横向抽取。要想实现AOP,其底层实现是使用了动态代理技术,在Spring中,动态代理技术分为传统的JDK动态代理和Cglib动态代理。这两种代理机制区别是:JDK动态代理:针对实现了接口的类进行代理Cglib动态代理:针对没有实现接口的类进行代理,底层是字节码增强技术,生成当前类的子...原创 2018-03-09 10:03:11 · 596 阅读 · 0 评论 -
Java解析XML
XML解析方式(1)DOM解析:解析器把**整个**XML文件加载到内存,并生成一个Document对象。优点:元素与元素之前保持依赖管理,可以对其进行CRUD操作。缺点:当XML文件过大时,可能会出现内存溢出问题。(2)SAX解析:一种速度更快、更有效的方法。它逐行扫描文档,一边扫描一边解析。基于事件驱动进行具体解析,每执行一行,都将触发对应的事件。优点:处理速度很快,可以处理大文件。缺点:只能读原创 2017-12-11 17:00:27 · 251 阅读 · 0 评论 -
Java教程
1 Java概述1.1 了解JavaJava是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun公司于1995年5月推出的Java程序设计语言和Java平台的总称,Java是一个纯的面向对象的程序设计语言。1.1.1 Java特点Java的特点 Java 编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。 Java的原创 2017-09-23 01:06:35 · 615 阅读 · 0 评论 -
Java中MD5计算摘要
计算摘要:/** * 利用MD5进行加密 * @author jitwxs * @version 创建时间:2017年8月15日 下午5:25:15 * @param str 待加密的字符串 * @return 加密后的字符串 * @throws NoSuchAlgorithmException 没有这种产生消息摘要的算法 *原创 2017-08-15 17:32:40 · 560 阅读 · 0 评论 -
JAVA集合之ArrayList和LinkedList
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。2.对于随机访问get和set,ArrayList优于LinkedList,因为ArrayList可以随机定位,而LinkedList要移动指针一步一步的移动到节点处。(参考数组与链表来思考)3.对于新增和删除操作add和remove,LinedList比较占优势,只需要对指针进行修改即可,而ArrayLi转载 2017-08-22 15:20:36 · 443 阅读 · 0 评论 -
JAVA中System.getProperty()方法使用
参数:key - 系统属性的名称。 返回:系统属性的字符串值,如果没有带有此键的属性,则返回 null。 以下为key值:java.versionJava 运行时环境版本java.vendorJava 运行时环境供应商java.vendor.urlJava 供应商的 URLjava.homeJava 安装目录java.vm.specification.versionJava 虚拟机原创 2017-07-25 13:59:00 · 1604 阅读 · 0 评论 -
Ajax实现文件上传(解决upload.parseRequest为空问题)
1.使用fileupload实现这种方式也是目前网上主要绝大部分Ajax文件上传的方法,前台代码如下:<!-- 定义上传按钮 --><input type="file" id="uploadFile"><button onclick="uploadFile()" >上传文件</button><scri原创 2018-03-15 21:52:02 · 5368 阅读 · 0 评论 -
Java8 LocalDate、LocalTime、LocalDateTime
参考文章:如何在Java 8中愉快地处理日期和时间、Java8中 Date和LocalDateTime的相互转换。java中做时间处理时一般会采用java.util.Date,但是在Java 8中新增了对日期的处理类,包括java.time.LocalDate、java.time.LocalTime、java.time.LocalDateTime等。java.util.Date和Simpl...原创 2018-03-18 19:38:15 · 1087 阅读 · 0 评论 -
Java设计模式——工厂模式
1. 什么是工厂模式工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一,它提供了一种创建对象的最佳方式。在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。优点:一个调用者想创建一个对象,只要知道其名称就可以了。扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。屏蔽产品的具体实现,调用者只...原创 2018-09-26 19:18:40 · 274 阅读 · 0 评论 -
Java设计模式——单例模式
一、单例模式的介绍1.1 什么是单例模式单例模式指的是一个类只会有一个实例,即一个类只有一个对象实例。它的特点有:单例类只能有一个实例单例类必须自己创建自己的唯一实例单例类必须给所有其他对象提供这一实例1.2 单例模式的应用场景(1)一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;售票时,一共有100张票,可有有多个窗口同时售票,但需要保证不要超售(这里...原创 2018-09-26 17:55:46 · 356 阅读 · 0 评论 -
Java并发编程——Thread类的使用
转载于:Java并发编程:Thread类的使用在学习Thread类之前,先介绍与线程相关知识:线程的几种状态、上下文切换,然后接着介绍Thread类中的方法的具体使用。一、线程的状态线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnable)、运行(running)、阻塞(blocked)、time waiting、waiting、...转载 2018-10-02 12:04:19 · 430 阅读 · 0 评论 -
Java并发编程——volatile关键字解析
转载于:Java并发编程:volatile关键字解析volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型...转载 2018-10-02 10:38:52 · 558 阅读 · 0 评论 -
Lombok的使用与原理
一、Lombok的简介Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一些注解来消除业务工程中冗长和繁琐的代码,尤其对于简单的Java模型对象(POJO)。在开发环境中使用Lombok插件后,Java开发人员可以节省出重复构建,诸如hashCode和equals这样的方法以及各种业务对象模型的accessor和ToString等方法的大量时间。对于这些方法,它能够...转载 2018-06-23 23:59:30 · 1974 阅读 · 0 评论 -
Java 8 中的 Streams API 详解
转载于:Java 8 中的 Streams API 详解一、为什么需要 StreamStream 作为 Java 8 的一大亮点,它与 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的 Stream。Java 8 中的 ...转载 2018-06-08 14:35:37 · 298 阅读 · 0 评论 -
Java反序列化漏洞分析
转载于:Java反序列化漏洞分析前言一、认识Java序列化与反序列化1.1 定义1.2 用途1.3 应用场景1.4 API实现1.5 代码实例二、理解漏洞的产生三、POC构造3.1TransformedMap3.2 Transformer接口3.3 AnnotationInvocationHandler3.4 代码实例四、漏洞分析4.1 漏洞...转载 2018-03-26 19:24:49 · 1351 阅读 · 0 评论 -
Java8 Optional详解
在Java8中新增了一个Optional类,官方描述是该类是一个容器对象,其中可能包含一个空或非空的值。如果存在一个值,isPresent()将返回true,get()将返回该值。错误使用姿势简单的根据描述,我们认为Optional可以帮我们解决NPE问题,假设任务需求为获取用户的性别,那么可以这样写::Optional&lt;User&gt; user = ...if(user...原创 2018-03-14 10:37:35 · 1753 阅读 · 0 评论