Java
文章平均质量分 82
架构攻城之路
敢拒绝,还有梦。
有qian,有闲,有成长;
有你,也有我。
展开
-
Java中finally与return的执行顺序
在Java的异常处理中,try、catch 和 finally 是按顺序执行的。如果 try 中没有异常,则顺序为 try→finally,如果 try 中有异常,则顺序为 try→catch→finally。但是当 try、catch、finally 中加入 return 之后,return 和 finally 的执行顺序让很多人混淆不清。下面来分别说明一下。1. try 和 catch 中带有return1)try 中带有 returnpublic class tryDemo { ...转载 2022-03-24 17:48:31 · 8252 阅读 · 1 评论 -
Java基础:java.util.concurrent.BlockingQueue
前言在一次项目中,偶遇BlockingQueue,特意查了下用法,使我对它有了强列的兴趣,经过一段时间的学习,将其整理,用图解的方式解释,方便理解。介绍在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。图(1_0.png)是其继承关系,可以看出BlockingQueue是继承Queue。我们先看下BlockQueue的图解,通过图.转载 2021-09-09 15:27:53 · 449 阅读 · 0 评论 -
字符串拼接还在用StringBuilder?快试试Java8中的StringJoiner吧,真香!
前言之前,我们经常会通过StringBuffer或者StingBuilder对字符串进行拼接,但是你知道Java8中推出的StringJoiner吗?它比前者更加优美、灵活,如果你现在还使用StringBuffer拼接,强烈推荐你试试StringJoiner。介绍在实用StringJoiner类之前,如果我们想要数据最终的字符串以逗号隔开,大概是这样的StringBuilder sb = new StringBuilder();IntStream.range(1,10).forEach(转载 2021-07-14 17:51:11 · 230 阅读 · 0 评论 -
面试官:如何让主线程等待所有的子线程结束之后再执行?我懵了
使用Thread的join方法package com.qcy.testThreadFinish;/** * @author qcy * @create 2020/09/09 17:05:23 */public class Case1 { public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> {转载 2021-07-12 15:19:52 · 784 阅读 · 0 评论 -
CompletableFuture 使用详解
1、 runAsync 和 supplyAsync方法CompletableFuture 提供了四个静态方法来创建一个异步操作。public static CompletableFuture<Void> runAsync(Runnable runnable)public static CompletableFuture<Void> runAsync(Runnable runnable, Executor executor)public static <U>转载 2021-07-12 12:45:17 · 961 阅读 · 0 评论 -
【Java8源码分析】NIO包-Buffer类:ByteBuffer与HeapByteBuffer(一)
1 概述Java NIO 由以下几个核心部分组成:Buffer Channel Selectors相关类的使用方法可以参考Java NIO 系列教程,写的通俗易懂。本文主要从源码方面分析一下Buffer类2 Buffer类Buffer类是一个抽象类,所有的XxxBuffer均继承此类。Buffer类的作用跟BufferedReader和BufferedInputStream类中的缓冲区作用是一样的。只不过线程Buffer独立出来,而且添加了更多的功能。2.1 构造函数p转载 2021-07-01 10:29:26 · 424 阅读 · 0 评论 -
Java魔法类:Unsafe应用解析
前言Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程序出错的概率变大,使得Java这种安全的语言变得不再“安全”,因此对Unsafe的使用一定要慎重。注:本文对s转载 2021-06-30 15:42:41 · 232 阅读 · 0 评论 -
LruCache里为什么用LinkedHashMap,HashMap可以吗?
近期有朋友准备面试,在群上我们会讨论一些面试题,每次我都会受到暴击,很多题目都答不上来。平时开发中,谷歌、第三方用得很溜,貌似解决了问题,可回想起来,技术没什么长进。比如我知道图片是用三级缓存,用的是Lru算法,可是如果不用glide,手写一个图片缓存工具类,我发现自己思路并不清晰。以写内存缓存为例,我会想到用强引用缓存,软引用缓存去实现,那么强引用,软引用具体使用哪些类去实现缓存是最好的?这个我都要去查一下,知道可以用LruCache,LinkedHashMap去缓存数据,LruCache为什么选择Lin转载 2021-05-31 17:53:10 · 700 阅读 · 0 评论 -
阿里二面:什么是mmap?--零拷贝
平时在面试中你肯定会经常碰见的问题就是:RocketMQ为什么快?Kafka为什么快?什么是mmap?这一类的问题都逃不过的一个点就是零拷贝,虽然还有一些其他的原因,但是今天我们的话题主要就是零拷贝。传统IO在开始谈零拷贝之前,首先要对传统的IO方式有一个概念。基于传统的IO方式,底层实际上通过调用read()和write()来实现。通过read()把数据从硬盘读取到内核缓冲区,再复制到用户缓冲区;然后再通过write()写入到socket缓冲区,最后写入网卡设备。整个过程发生了转载 2021-04-25 09:46:33 · 903 阅读 · 0 评论 -
【JVM系列三】HotSpot JVM的垃圾回收算法实现-JVM垃圾回收器
引言上一篇文章《【JVM系列二】深入理解JVM 垃圾回收算法》,详细介绍了JVM对象存活的判定算法(引用计数法、可达性分析法--GC Roots 引用链),以及常用的垃圾回收算法(标记-清除、复制、标记-整理),本文将分析HotSpot的垃圾回收算法的具体实现。在HotSpot VM中实现这些算法,必须对算法的执行效率进行严格考量,才能保证虚拟机的高效运行。目前主流的商业虚拟机都是采用“分代收集”的垃圾算法,它主要是根据对象存活周期的不同将堆内存划分为几块。一般是将Java堆分为新生代与老年代,根原创 2021-01-29 12:22:32 · 391 阅读 · 2 评论 -
【JVM系列二】深入理解JVM 垃圾回收算法
引言上一篇文章,我们分析了JVM运行时数据区,大致知道了JVM各个内存区域分别存储哪些数据,以及Java堆中对象的创建、布局与如何访问,具体可查看《【Java高级】深入理解JVM内存模型,看完这篇足以!》。本文我们主要分析JVM的垃圾回收相关内容。那么,我们在进入正文前,可以先思考以下几个问题:哪些内存需要回收? 什么时候回收? 如何回收?一、概述我们来先看一下,JVM体系结构概览图:其中,程序计数器、虚拟机栈、本地方法栈3块区域都是线程私有的,因此生命周期与线程相同。栈中原创 2021-01-28 11:11:27 · 580 阅读 · 0 评论 -
【JVM系列一】深入理解JVM内存模型,从这一篇开始!
前言版本:JDK1.7本文主要内容是摘自《深入理解Java虚拟机》一书,进行知识点的梳理与归纳总结,方便分享与交流,如有不对的地方还望指出。1 JVM运行时数据区根据《Java虚拟机规范(JavaSE7版)》的规定,Java虚拟机所管理的内存主要包括以下几个运行时数据区域:1.1 程序计数器特点:内存空间小,线程私有。它可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行指令的字节码指令,分支、循环、跳转、异常处原创 2021-01-27 14:27:04 · 360 阅读 · 1 评论 -
【Java必备】Java代理模式(静态代理、JDK/Cglib动态代理)
引言相信作为Java开发人员,应该都有用过或见过代理设计模式,像Spring的AOP中,就是使用的动态代理模式,Mybatis中xxxMapper接口,也是使用的动态代理来生成相应的Mapper代理对象,可见,动态代理模式的重要性。代理模式一般分为静态代理和动态代理,目标都是为了扩展增强原有方法功能。静态代理抽象对象角色(AbstractObject):一般使用接口或抽象类,声明了目标对象和代理对象的共同接口,这样依赖在任何可以使用目标对象的地方都可以使用代理对象。 目标对象角色(Re原创 2020-12-29 16:07:58 · 494 阅读 · 0 评论 -
【微信登录】APP/网站应用的微信扫码登录
目录一、开发文档说明移动应用APP端(安卓/苹果)的微信登录网站应用PC端的微信扫码登录微信开放平台申请账号二、业务接口开发1、配置2、第一步:请求CODE3、第二步:通过code获取access_token4、工具方法5、测试一、开发文档说明移动应用APP端(安卓/苹果)的微信登录准备工作移动应用微信登录是基于OAuth2.0 协议标准构建的微信 OAuth2.0 授权登录系统。在进行微信 OAuth2.0 授权登录接入之前,在微信开放平台注册开原创 2020-12-16 09:27:12 · 5391 阅读 · 0 评论 -
记一次订单号事故
去年年底的时候,我们线上出了一次事故,这个事故的表象是这样的:系统出现了两个一模一样的订单号,订单的内容却不是不一样的,而且系统在按照订单号查询的时候一直抛错,也没法正常回调,而且事情发生的不止一次,所以这次系统升级一定要解决掉。经手的同事之前也改过几次,不过效果始终不好:总会出现订单号重复的问题,所以趁着这次问题我好好的理了一下我同事写的代码。这里简要展示下当时的代码: /** * OD单号生成 * 订单号生成规则:OD + yyMMddHHmms...转载 2020-09-01 18:10:28 · 206 阅读 · 0 评论 -
【Java反射实战】手写实现一个Spring IoC
手动实现一个简单的Spring IoC容器,管理Bean1、方式一:简单版,初始化时,手动new 再设置进hashMapkey:接口的class value:实现类的实例测试:直接从通过key名从HashMap获取2、方式二:改进版,通过配置文件+反射,初始化bean配置文件内容:接口=实现类通过类加载器读取配置文件内容,再反射实例化,设置进HashMap3、方式三:注解+扫描 类路径下的所有文件(接口+实现类),反射实例化,放到一个H...转载 2020-12-11 15:02:19 · 559 阅读 · 0 评论 -
【Java高级】反射学习二——反射
一、反射入门在方法区存在这么一些对象,叫做类对象,他们表述了我们写的所有的类,当我们new对象时会根据这些类对象,并调用其构造方法为我们创建实例。JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。简单的说:一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出类的各个组成部分。Java反射机制主要提供了以下功能转载 2020-12-11 11:36:14 · 282 阅读 · 0 评论 -
【Java高级】反射学习一——注解
Java注解类型(@Annotation)Java注解是JDK5时引入的新特性,鉴于目前大部分框架(如Spring)都使用了注解简化代码并提高编码的效率,因此掌握并深入理解注解对于一个Java工程师来说是件很有必要的事情。1. 理解Java注解实际上Java注解与普通修饰符(pubic, static void等)的使用方式没有多大区别,下面的例子是常见的注解:/** * @author zn * @date 2020/3/30 **/public interface Animal转载 2020-12-11 11:27:32 · 242 阅读 · 0 评论 -
【Java必备】JAVA 关于 SPI 机制
摘要: 原创出处https://www.cnkirito.moe/spi/「徐妈」欢迎转载,保留摘要,谢谢!JDK提供的SPI(Service Provider Interface)机制,可能很多人不太熟悉,因为这个机制是针对厂商或者插件的,也可以在一些框架的扩展中看到。其核心类java.util.ServiceLoader可以在jdk1.8的文档中看到详细的介绍。虽然不太常见,但并不代表它不常用,恰恰相反,你无时无刻不在用它。玄乎了,莫急,思考一下你的项目中是否有用到第三方日志包,是否有用到...转载 2020-12-10 15:48:35 · 427 阅读 · 0 评论 -
高并发Java秒杀系统优化(三)--接口限流防刷
如何实现接口限流防刷有了对用户的访问进行一定的限制,就可以减轻服务器压力。例如通过访问次数的限制就是一种限流防刷的手段。即限制用户下一定的时间间隔内对接口的访问次数。实现思路:对接口限流一般来讲如果使用计时器来做这个功能,实现起来比较复杂。在这里,我们可以充分利用redis中的key-value过期机制来完成。在redis中存储一个用于记录访问次数的变量,在过期时间内...原创 2020-04-11 15:04:19 · 1411 阅读 · 0 评论 -
【JavaWeb必知】从 Servlet 入手带你看架构和框架设计的套路
为什么要有 Servlet ,什么是 Servlet 容器,什么是 Web 容器?以下代码相信大家都很熟悉,大学时学 Java Web 都写过这样的代码。从第一次接触 Servlet 到之后的很长一段时间内,我都没理解 Servlet 是个什么玩意?为什么要有 Servlet ?为什么要有 Servlet 容器?啥又是 Web 容器、HTTP 服务器?今儿咱们就来盘盘,并且从中来看看架构和框架的设计套路。看完之后可能对接口、抽象会有进一步的认识。来,上车!正文首先转载 2020-12-09 10:58:32 · 438 阅读 · 0 评论 -
Java8新特性之三:Stream API
Java8的两个重大改变,一个是Lambda表达式,另一个就是本节要讲的Stream API表达式。Stream 是Java8中处理集合的关键抽象概念,它可以对集合进行非常复杂的查找、过滤、筛选等操作,在新版的JPA中,也已经加入了Stream。如:@Query("select u from User u")Stream<User> findAllByCustomQueryAndStream();Stream<User> readAllByFirstnameNotNull转载 2020-08-13 12:09:44 · 307 阅读 · 0 评论 -
源码浅析ArrayList、LinkedList和Vector的区别
一直以来虽然经常使用Java的集合框架,但是从来没有看过他们的源码。直到前段时间有人问我HashMap的实现原理,我当时很懵逼说不出个所以然来。最近恰好有时间,打算复习一遍集合框架,这是关于集合的第一篇博客,会有很多不足,希望各位大神能够一一指出,谢谢。如果想看结论,请拉到尾部。1、准备知识了解数据结构的数组和链表等知识 了解二进制基础 了解Java位运算2、ArrayL...转载 2020-04-24 15:50:05 · 372 阅读 · 0 评论 -
【细谈Java并发】谈谈LockSupport
1、简介LockSupport 和 CAS 是Java并发包中很多并发工具控制机制的基础,它们底层其实都是依赖Unsafe实现。LockSupport是用来创建锁和其他同步类的基本线程阻塞原语。LockSupport 提供park()和unpark()方法实现阻塞线程和解除线程阻塞,LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默...转载 2020-04-20 15:00:37 · 533 阅读 · 0 评论 -
【高并发】ThreadLocal学会了这些,你也能和面试官扯皮了!
前言我们都知道,在多线程环境下访问同一个共享变量,可能会出现线程安全的问题,为了保证线程安全,我们往往会在访问这个共享变量的时候加锁,以达到同步的效果,如下图所示。对共享变量加锁虽然能够保证线程的安全,但是却增加了开发人员对锁的使用技能,如果锁使用不当,则会导致死锁的问题。而ThreadLocal能够做到在创建变量后,每个线程对变量访问时访问的是线程自己的本地变量。什么是Threa...转载 2020-04-16 09:23:18 · 246 阅读 · 0 评论 -
【高并发】朋友去面试竟然栽在了Thread类的源码上
前言最近和一个朋友聊天,他跟我说起了他去XXX公司面试的情况,面试官的一个问题把他打懵了!竟然问他:你经常使用Thread创建线程,那你看过Thread类的源码吗?我这个朋友自然是没看过Thread类的源码,然后,就没有然后了!!!所以,我们学习技术不仅需要知其然,更需要知其所以然,今天,我们就一起来简单看看Thread类的源码。注意:本文是基于JDK 1.8来进行分析的。Thre...转载 2020-04-15 11:05:33 · 251 阅读 · 0 评论 -
Serializable:明明就一个空接口!为什么还要实现它?
对于 Java 的序列化,我一直停留在最浅显的认知上——把那个要序列化的类实现Serializbale接口就可以了。我不愿意做更深入的研究,因为会用就行了嘛。但随着时间的推移,见到Serializbale的次数越来越多,我便对它产生了浓厚的兴趣。是时候花点时间研究研究了。01、先来点理论Java 序列化是 JDK 1.1 时引入的一组开创性的特性,用于将 Java 对象转...转载 2020-03-10 11:07:24 · 381 阅读 · 1 评论 -
【Java高级进阶必备】ReentranLock--AbstractQueuedSynchronizer超详细原理解析
今天我们来研究学习一下AbstractQueuedSynchronizer类(抽象队列同步器)的相关原理,java.util.concurrent包中很多类都依赖于这个类所提供队列式同步器,比如说常用的ReentranLock,Semaphore和CountDownLatch等。 为了方便理解,我们以一段使用ReentranLock的代码为例,讲解ReentranLock每个方法中有关AQS的使...转载 2020-03-09 10:04:51 · 734 阅读 · 0 评论 -
浅谈Java的Unsafe类,是否一脸懵?
本文主要内容Unsafe类介绍 Unsafe的主要功能 总结1、Unsafe类介绍第一次看到这个类时被它的名字吓到了,居然还有一个类自名Unsafe?读完本文,大家也能发现Unsafe类确实有点不那么安全,它能实现一些不那么常见的功能。Unsafe类使Java拥有了像C语言的指针一样操作内存空间的能力,同时也带来了指针的问题。过度的使用Unsafe类会使得出错的几率变大,因此Ja...转载 2020-03-04 14:24:27 · 315 阅读 · 0 评论 -
高级开发必须理解的Java中SPI机制
本文通过探析JDK提供的,在开源项目中比较常用的Java SPI机制,希望给大家在实际开发实践、学习开源项目提供参考。1 SPI是什么SPI全称Service Provider Interface,是Java提供的一套用来被第三方实现或者扩展的API,它可以用来启用框架扩展和替换组件。整体机制图如下:Java SPI 实际上是“基于接口的编程+策略模式+配置文件”组合实现的动态...转载 2020-03-03 16:20:47 · 324 阅读 · 0 评论 -
为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过。我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分,有没有放过自定义对象?而这个时候,候选人说放过,于是两个问题的回答就自相矛盾了。 最近问下来,这个问题普遍回答不大好,于是在本文里,就干脆从hash表讲起,讲述HashMap的存数据规则,由...转载 2020-01-11 14:14:57 · 247 阅读 · 0 评论 -
spi的初步认识
spi一般都是官方定义好一个规则,硬件厂家根据这个接口定义的规则,结合自己产品的情况给出对应的实现,所以不同的厂家会有不同的实现,这就使得我们使用者的使用的难度加大。spi的出现解决了这一问题,我们只需要给出对应的配置参数,就能通过接口获取到对应的实现类对象。下面这段代码是一个spi的简单实现,使用的是jdk封装好的ServiceLoader,首先定义一个接口:public int...转载 2020-01-09 15:35:08 · 183 阅读 · 0 评论 -
你真的了解Java常量池吗?不同JDK版本有什么区别?
首先,我们来看看常量池的概念,常量池可以分成3类:1.静态常量池:也就是class文件中的常量池,一般用来存放class文件中定义的一些常量,包括类和接口的全限定名,字段的名称和描述符以及方法和名称和描述符。2.字符串常量池:即class文件中定义的String类型,这个常量池就存在与静态常量池中。3.运行时常量池:我们平时所说的常量池就是这个了,它存放在方法区中,当所有的class文...转载 2020-01-09 15:08:57 · 479 阅读 · 0 评论 -
牛逼哄哄的 Lambda 表达式,简洁优雅就是生产力!
什么是Lambda?我们知道,对于一个Java变量,我们可以赋给其一个“值”。如果你想把“一块代码”赋给一个Java变量,应该怎么做呢?比如,我想把右边那块代码,赋给一个叫做aBlockOfCode的Java变量:在Java 8之前,这个是做不到的。但是Java 8问世之后,利用Lambda特性,就可以做到了。当然,这个并不是一个很简洁的写法。所以,为了使这个赋值操...转载 2019-12-31 10:01:16 · 170 阅读 · 0 评论 -
ChinaPay银联电子支付-退款功能
引言如果还不了解UnionPay、ChinaPay概念与配置的,可以先移步到《B2B电商平台--ChinaPay银联电子支付功能》,此篇文章会带你熟悉ChinaPay支付流程的完整开发步骤。一、消费类交易流程本次只讲解退款申请流程,所以上面两个流程简单看下即可,退款流程如下:二、后续类交易接口根据ChinaPay银联接口开发文档4.15后续类交易接口说明:后...原创 2019-10-26 10:49:53 · 2958 阅读 · 2 评论 -
通过lombok带你读透Builder构建器
通过lombok带你读透Builder构建器很久之前,我在《effective java》上看过Builder构建器相关的内容,但实际开发中不经常用。后来,在项目中使用了lombok,发现它有一个注解“@Builder”,就是为java bean生成一个构建器。于是,回头重新复习了下相关知识,整理如下。1. lombok使用样例// 创建名为Officer的java bean@Bu...转载 2019-10-25 14:16:20 · 207 阅读 · 1 评论 -
Java并发之CountDownLatch、Semaphore和CyclicBarrier实例详解
JAVA并发包中有三个类用于同步一批线程的行为,分别是CountDownLatch、Semaphore和CyclicBarrier。CountDownLatchCountDownLatch是一个计数器闭锁,通过它可以完成类似于阻塞当前线程的功能,即:一个线程或多个线程一直等待,直到其他线程执行的操作完成。CountDownLatch用一个给定的计数器来初始化,该计数器的操作是原子操作,...转载 2019-08-21 09:56:56 · 302 阅读 · 0 评论 -
JDK/Java 13 发布GA 新特性
2019-9-17JDK/Java 13 正式 GA,如下:Jdk13新特性:(1)350:Dynamic CDS Archives--概要扩展应用程序类-数据共享,以允许在Java应用程序执行结束时动态归档类。存档的类将包括所有加载的应用程序类和库类,这些类不在默认的底层CDS(class data-sharing)存档中。--目标 提高应用程序类数据共享(...原创 2019-09-19 08:44:10 · 280 阅读 · 0 评论 -
JDK13新特性详解
JDK8 新特性详解,2014-03-18正式发布 JDK9 新特性详解,2017-09-21正式发布 JDK10新特性详解,2018-03-20正式发布 JDK11新特性详解,2018-09-25正式发布 JDK12新特性详解,2019-03-19正式发布 JDK13新特性详解,2019-09-17正式发布...转载 2019-09-20 09:27:34 · 438 阅读 · 0 评论 -
JSON Web Token - 在Web应用间安全地传递信息
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。让我们来假想一下一个场景。在A用户关注了B用户的时候,系统发邮件给B用户,并且附有一个链接“点此关注A用户”。链接的地址可以是这样的 https://your.awesome-app.com/make-friend/?from_user=B&targe...转载 2019-09-26 09:39:19 · 199 阅读 · 0 评论