
Java
文章平均质量分 85
分享 Java 相关技术点。
春日安然
做一个乐观善良而温暖的人,好好学习,成为更优秀的自己。
展开
-
Dubbo 专题(基础篇):Dubbo 介绍、环境搭建与实践
本篇博客属于 Dubbo 的入门基础篇,内容主要包括 Dubbo 概念,Dubbo 特点,Dubbo 基本工作原理,Dubbo 环境搭建,Dubbo Demo 实践,一起来学习下吧。原创 2021-12-12 17:34:48 · 706 阅读 · 0 评论 -
【日常学习分享】JVM 分代垃圾回收是如何进行的?
JVM 的垃圾收集算法主要包括 4 种:标记-清除算法,标记-整理算法,复制算法,分代收集算法,相比而言,分代收集算法是最常用的,也相对复杂一点,所以在此整理记录一下,加深记忆。垃圾收集的是哪里?首先抛出一个问题,垃圾收集,收集的到底是哪里?我们来看一下 Java 的内存区(又叫做运行时数据区),如下图所示:可以看出,按照线程共享和线程私有可以分为两大块,各自的组成如下:线程共享:堆,方法区(HotSpot 的永久代);线程私有:程序计数器,Java 虚拟机栈,本地方法栈;在内存结构中原创 2021-11-18 22:47:07 · 1023 阅读 · 0 评论 -
【日常学习记录】Java 常用线程并发类的应用实例
之前复习线程并发的时候曾经写过博客,对 ReentrantLock 的实现原理进行了详细的介绍,链接如下:https://blog.youkuaiyun.com/j1231230/article/details/120572008常用常新,趁着还没忘再回顾一下相关知识,保持学习的好习惯非常重要。可以知道,ReentrantLock 实现的前提是 AbstractQueuedSynchronizer(抽象队列同步器),简称 AQS,是 java.util.concurrent 的核心,常用的线程并发类 CountD原创 2021-10-25 17:44:00 · 593 阅读 · 0 评论 -
动画详解十大经典排序算法【Java版实现】(下)
上篇博客介绍了五种排序算法,分别为:冒泡排序,选择排序,插入排序,希尔排序,归并排序,博客地址如下:动画详解十大经典排序算法【Java版实现】(上)本篇博客针对剩下的五种排序算法展开介绍:快速排序,堆排序,计数排序,桶排序,基数排序。1. 快速排序算法介绍通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录均比另一部分记录小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的效果。动画演示步骤描述 从数列中挑出一个元素,称为 “基准”; 重新排序数.原创 2021-10-19 20:56:28 · 988 阅读 · 0 评论 -
动画详解十大经典排序算法【Java版实现】(上)
经典排序算法可以说是面试必考题,然而大学毕业之后基本都忘光了,正好趁这个机会拿出来好好总结复习下,也算不辜负当年老师的一片苦心了。十大经典排序算法包括:冒泡排序,选择排序,插入排序,希尔排序,归并排序,快速排序,堆排序,计数排序,桶排序,基数排序。本来准备一口气把十种都介绍一遍,然而整理完前五种后大脑就宕机了(亲测熬夜会使人变傻······),那干脆就分为上下两部分好了,正好也方便记忆。接下来我们用动画的方式,先来分析前五种算法:冒泡排序,选择排序,插入排序,希尔排序,归并排序。1. 冒泡排原创 2021-10-09 18:57:05 · 817 阅读 · 0 评论 -
ReentrantLock的实现原理
ReentrantLock 简介ReentrantLock 实现了 Lock 接口,是一种可重入的独占锁。相比于 synchronized 同步锁,ReentrantLock 更加灵活,拥有更加强大的功能,比如可以实现公平锁机制。首先,先来了解一下什么是公平锁机制。ReentrantLock 的公平锁机制我们知道,ReentrantLock 分为公平锁和非公平锁,可以通过构造方法来指定具体类型://默认非公平锁public ReentrantLock() { sync =原创 2021-09-30 23:11:20 · 4526 阅读 · 0 评论 -
Java中synchronized关键字的使用和原理
synchronized关键字的使用synchronized 关键字是 Java 中一个独占式的悲观锁,可以用来修饰方法块和方法,根据锁定对象的类型进行分类,可以分为对象锁和类锁。对象锁修饰同步代码块:锁定对象为 this 或者实例对象;public class Sync{ private int a = 0; public void add(){ // 锁定对象为 this synchronized(this){原创 2021-09-29 15:48:20 · 1137 阅读 · 0 评论 -
乐观锁实现之CAS算法分析
在介绍 CAS 之前,先来了解下什么是乐观锁。乐观锁(Optimistic Lock)是指对于数据冲突保持一种乐观态度,操作数据时不会对数据加锁,只有到数据提交的时候才通过某种机制来验证数据是否存在冲突。可以通过使用版本号和 CAS 算法进行实现,本篇博客主要介绍CAS 算法的概念,以及对 CAS 算法的实现原理进行分析。什么是 CAS 算法CAS:Compare and Swap,即比较再交换,其算法公式如下:函数公式:CAS(V,E,N)CAS 操作需要我们提供一个期望值,.原创 2021-09-25 22:06:42 · 1023 阅读 · 0 评论 -
CopyOnWriteArrayList 实现原理
CopyOnWriteArrayList 是什么CopyOnWriteArrayList是 Java 并发包 java.util.concurrent 中提供的并发容器,本质上是一个线程安全且读操作无锁的 ArrayList。它在确保线程安全的前提下,通过牺牲写操作的效率来保证读操作的高效。所谓 CopyOnWrite 就是通过复制的方式来完成对数据的修改,在修改时复制一个新的数组,在上面进行修改,不会对旧的数组进行改变,也就没有读写数据不一致的问题了。CopyOnWriteArrayList.原创 2021-09-22 21:44:34 · 946 阅读 · 0 评论 -
ConcurrentHashMap 实现原理
一.ConcurrentHashMap 是什么在并发编程中,ConcurrentHashMap 是一个经常被使用的数据结构,相比于 Hashtable 以及Collections.synchronizedMap() 来说,ConcurrentHashMap 在线程安全的基础上提供了更好的写并发能力,同时还降低了对读一致性的要求,是 java.util.concurrent包里面提供的一个线程安全并且高效的 HashMap。二.ConcurrentHashMap 的不同版本实现JDK 1.7...原创 2021-09-19 22:45:22 · 3625 阅读 · 0 评论 -
深入理解 Java 中的反射机制
一. 什么是反射在理解反射这个概念之前,我们先来理解 Java 中的 “正射”。在编写代码时,如果需要使用某一个类,必定先会去了解这是一个什么类,用来做什么,有怎么样的功能。之后才会对这个类进行实例化,以及使用对应的实例化对象进行下一步的操作。而反射则是在代码一开始编写时不知道要初始化的类是什么,自然也无法使用 new 关键字来创建对象。它的定义如下:在运行状态中,对于任意一个类,都能够在运行时知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息原创 2021-08-28 20:44:21 · 546 阅读 · 0 评论 -
Java 中多态的实现原理
一. 什么是多态多态是面向对象编程里面的概念,一个接口的多种不同的实现方式,即为多态。这里的接口不应理解得太死板,比如在 Java 里面,继承一个类和实现一个接口本质上都是一种继承行为,因此都可以理解为多态的体现。从静态和动态的角度进行划分,多态可以分为编译时多态和运行时多态。编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法,编译之后会变成两个不同的方法。而运行时多态是动态的,是通过动态绑定来实现的,也就是大家通常所说的多态性,本篇博客主要讨论运行时多...原创 2021-08-26 22:14:22 · 6296 阅读 · 6 评论 -
深入理解接口幂等性
一. 什么是接口幂等性幂等性原本是数学上的概念,用在接口上就可以理解为:同一个接口,多次发出同一个请求,必须保证操作只执行一次。它是系统服务对外的一种承诺(注意不是一种实现),接口服务提供方承诺只要调用接口成功了,外部多次调用对系统的影响是一致的。举一个最常见的例子,用户购买商品后支付扣款成功,但是此时网络发生了异常,导致返回结果失败。因为没收到返回结果,用户就会再次点击付款按钮,就会多付了一笔钱,一旦用户发现余额少了,开发人员就等着被祭天吧,这就是没有保证接口的幂等性。需要强调一点是,声明为幂原创 2021-08-22 13:04:43 · 1430 阅读 · 2 评论 -
【Java 总结思考】Java 答疑解惑之网络通信篇
打破舒适圈,经常对知识进行总结思考,才能保证自己不掉队。系统化重学 Java 第五篇,虽然网络通信不属于 Java 技术领域,但是它是很重要的基础知识,也需要熟练掌握。开头碎碎念终于还是提了离职,在单位待了整整六年,走到最后满心疲惫,最初的热情消耗殆尽。烟台这个城市很美,人很热情,大海也很漂亮,但我终究不属于这里。离职是改变的起点,改变也意味着新的契机,虽然不知道未来在哪里,但是心怀希望,全力去做总是没错的。言归正传,系统化重学 Java 不知不觉更新到第五篇了,越来越发现 “知.原创 2021-08-08 15:46:02 · 412 阅读 · 1 评论 -
【详细图解】一个 Java 对象是如何被创建的?
程序员日常最喜欢的自我调侃就是,没有对象很简单啊,自己写代码 new 一个不就好了,说到这里,我们的骄傲就已经尽数体现了。不过一个简简单单的 new 背后,JVM 到底为我们做了些什么呢,Java 的对象具体是怎么被创建的呢,一起来看看吧。原创 2021-07-20 13:01:42 · 1043 阅读 · 3 评论 -
【Java 总结思考】Java 答疑解惑之 IO 篇
打破舒适圈,经常对 Java 知识进行总结思考,才能保证自己不掉队。如果在看的小伙伴有关于 IO 方面的问题,欢迎评论区留言,我们一起寻找答案,共同进步~原创 2021-07-15 15:07:32 · 436 阅读 · 2 评论 -
【Java 总结思考】Java 答疑解惑之异常篇
打破舒适圈,经常对 Java 知识进行总结思考,才能保证自己不掉队。系统化重学 Java 第三篇,一起分析下Java 异常中的常见疑问点吧。第一问: 为什么 Java 要引入异常机制?在没有异常处理机制的语言中,比如C语言,在函数调用过程中就只能通过检查函数返回值错误码方式来判断函数调用是否正确执行,这会扰乱正常代码流程,而且事实上高傲的程序员也很少去检查错误码。异常处理让异常无法像错误码一样被忽略,必须写代码去捕获。另外,使用异常代替返回错误码,错误处理代码就能从主路径代码中分离出来..原创 2021-07-02 17:37:58 · 432 阅读 · 0 评论 -
【Java 总结思考】Java 答疑解惑之基础篇
凡事多问为什么,寻找背后的答案,是一个优秀程序员最基本的素养。这是第一篇,我会坚持更新下去,大家在评论里提的问题,我都会补充到博客里进行解答。系统化重学 Java 之路,一起出发吧!原创 2021-06-21 10:00:14 · 639 阅读 · 3 评论 -
ThreadLocal实现原理分析
一. ThreadLocal是什么ThreadLocal 可以理解为线程本地变量,每个线程拥有本地变量的副本,各个线程之间的变量互不干扰,主要用于保证多线程环境下变量的安全。也就是对于同一个 ThreadLocal,每个线程通过 get、set、remove 接口操作只会影响自身线程的数据,不会干扰其他线程中的数据。二. ThreadLocal的数据结构ThreadLocal 的数据结构如下图所示:可以看出,每个线程都拥有自己的一个 ThreadLocalMap,它是 ThreadLocal 中原创 2021-04-27 17:43:18 · 880 阅读 · 2 评论 -
Java线程池简析
一. 线程池的好处合理利用线程池能够带来三个好处。1.降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁造成的消耗。2.提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。3.提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。二. Java线程池参数解析Java 提供的线程池相关的工具类中,最核心的是 ThreadPoolExecutor,完备的构造函数有 7 个参数,如下所原创 2021-04-15 12:11:00 · 1004 阅读 · 0 评论 -
进程同步互斥工具:管程
一. 什么是管程管程(Monitors) 指的是管理共享变量以及对共享变量的操作过程,让他们支持并发。它是 Java 语言在1.5之前提供的唯一并发原语,而 Java 1.5之后提供的 SDK 并发包也是以管程技术为基础的。二. 为什么使用管程信号量机制本身存在着缺点:进程自备同步操作,P(S) 和 V(S) 操作大量分散在各个进程中,不易管理,易发生死锁。而管程封装了同步操作,对进程隐蔽了同步细节,简化了同步功能的调用界面,使得用户编写并发程序如同编写顺序(串行)程序一样简单。引入管程机制的目的:原创 2021-02-20 16:36:03 · 1647 阅读 · 0 评论 -
HashMap中的indexFor方法分析
在整理HashMap的工作原理时,发现它调用了 indexFor(int h, int length) 方法来计算Entry对象保存在 table中的数组索引值:static int indexFor(int h, int length) { return h & (length-1);}它没有对hash表的长度取余而使用了位运算来得到索引,这是为什么呢,顿生怀疑~分析//获取当前tabl原创 2017-09-23 17:22:41 · 8899 阅读 · 4 评论 -
java开发之消除冗余代码的3种方法
一.利用工厂模式+模板方法模式我们以做蛋糕为例来演示如何消除重复代码。假设我们要做3种不同口味的蛋糕,分别是抹茶,可可和草莓蛋糕,实际上3种蛋糕的制作方法是极其相似的,只有添加的粉剂不同,如果用代码来实现蛋糕制作流程,要写大量重复代码,容易产生BUG,我们可以使用工厂模式和模板方法模式来避免重复。首先定义一个蛋糕类Cake:@Datapublic class Cake { // 蛋糕名称 String cakeName; Integer sugar; Integer原创 2020-05-13 21:00:24 · 3882 阅读 · 0 评论 -
java的代理机制(静态代理和动态代理)
在探讨动态代理前,我们首先要知道什么是代理。一. 代理的概念为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。从图中可以看出,代理接口(Subject)、代理类(ProxySubject)、委托类(Re...原创 2020-05-05 18:35:20 · 375 阅读 · 0 评论 -
Exception异常处理机制浅析
Java语言提供了异常处理机制,在日常编码中使用Exception的频率很高,而Error的使用频率相对较低一些,本篇博客主要针对这两种类型的异常进行分析。Exception 和 Error 都继承自Throwable,在 Java 中只有Throwable类型的实例才可以被抛出或者捕获,它是异常处理机制的基本组成类型。异常Exception和错误Error 的本质区别在于:异常能被程序本身处理...原创 2019-07-02 11:00:11 · 628 阅读 · 0 评论 -
JAVA集合类Collection浅析
java.util.Collection是集合类的一个顶级接口,它提供了操作集合对象的通用接口方法,包含了集合的基本操作和属性,直接继承接口有List与Set。ListList接口及其实现类是容量可变的列表,可按索引访问集合中的元素。 特点:集合中的元素有序、可重复; List接口一共有三个实现类,分别是ArrayList、LinkedList和Vector。1.ArrayLi原创 2017-09-08 14:28:03 · 408 阅读 · 0 评论 -
Java中HashMap的工作原理
HashMap实现了Map接口,是基于哈希表的非同步实现,它以键值对(key-value)的形式存储元素,键和值都可以为null。HashMap不保证映射的顺序,特别是它不保证该顺序不变。HashMap底层实现它的底层是通过数组实现的,数组的每个元素是链表,由Entry内部类实现,Entry重要的属性有 key , value, next。其中Java源码如下:transien原创 2017-09-15 16:45:51 · 513 阅读 · 0 评论 -
Java垃圾回收机制浅析
在C++中,对象所占的内存在程序结束运行之前会一直被占用,在明确释放之前不能分配给其它对象;而在Java中,当没有对象引用指向原先分配给某个对象的内存时,该内存便成为垃圾,JVM的一个系统级线程会对该内存块进行自动释放。垃圾回收优势:1.垃圾回收能自动释放内存空间,减轻编程的负担,使java程序员在编写程序时不需要再考虑内存管理的问题。2.垃圾回收机制使java中的对象不再有“作用域”的概念,只有引原创 2017-10-20 16:10:06 · 480 阅读 · 0 评论 -
java内存模型
java内存模型(Java Memory Model,简称JMM)隶属于JVM(Java虚拟机),它定义了Java虚拟机在计算机内存(RAM)中的工作方式,也就是说它规范了Java虚拟机与计算机内存之间是如何协同工作的。JMM规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步地访问共享变量 。JMM把JVM内部划分为线程栈和堆,如下图所示:每个运行在JVM中的线程都拥有自原创 2017-10-11 09:14:01 · 285 阅读 · 0 评论 -
String与StringBuffer,StringBuilder的区别
这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。1.运行速度String < StringBuffer < StringBuilder首先String为字符串常量,一旦创建之后该对象不可更改;StringBuilder和StringBuffer均为字符串变量,可以更改。String实现原理:我们创建的String对象中的字符串是通过private final char value[原创 2017-11-20 17:26:33 · 295 阅读 · 0 评论 -
使用 Java 的 ArrayList 踩过的那些坑
平时开发中,ArrayList 的使用频率是相当高的,但一不小心就容易踩坑,在这里记录一下。1. 使用 Arrays.asList 的坑使用场景正常使用 Arrays.asList 不会有太大问题List<Integer> testList = Arrays.asList(1, 2, 3);添加一个元素,理想状态会输出结果:truetestList.add(4);System.out.println(testList.contains(4));实际运行会报错:问题分析正原创 2021-03-30 21:14:01 · 875 阅读 · 0 评论 -
Spring的声明式事务@Transactional注解的6种失效场景
一.Spring事务管理的两种方式事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种。编程式事务:是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例:try { //TODO something transactionManager.commit(status);} catch (Excep...转载 2020-04-16 13:13:16 · 4595 阅读 · 4 评论 -
[转载]Spring Security 工作原理概览
Security 原理分析SpringSecurity 过滤器链SpringSecurity 采用的是责任链的设计模式,它有一条很长的过滤器链。现在对这条过滤器链的各个进行说明:1.WebAsyncManagerIntegrationFilter:将 Security 上下文与 Spring Web 中用于处理异步请求映射的 WebAsyncManager 进行集成。2.SecurityC...转载 2020-03-15 17:16:55 · 287 阅读 · 0 评论 -
Thrift c++ server / java client配置
在安装thrift前需要安装libevent,用于生成对应的lib链接。server端Linux配置1.下载 从官网http://thrift.apache.org/上下载thrift-0.8.0版本,之前使用的是0.9.3版本,编译时会报错,因而改成了0.8.0版本。2.解压thrift压缩文件tar zxvf thrift-0.8.0.tar.gz 3.原创 2017-09-08 21:15:49 · 2279 阅读 · 0 评论 -
Java 读取网络图片存储到本地并生成缩略图
之前使用 Python 爬虫抓取电影网站信息作为自己网站的数据来源,其中包含的图片都是网络图片,会存在这样一个问题:当原始网站访问速度比较慢时,网站图片加载时间也会变得很慢,而且如果原始网站挂了,图片就直接访问不到了。此时的用户体验就很不好,所以对此进行了优化:每次后端启动时会默认开启任务先将未转换的网络图片存储到本地,再把网页中图片列表改为访问本地图片,这样就解决了加载慢的问题,也降低了和原始网站的耦合性,具体步骤如下:1.创建用于保存图片的文件夹我的保存路径:F:\images2.新建 cr原创 2021-03-28 16:33:39 · 825 阅读 · 0 评论 -
spring data jpa复杂多条件查询
1.排序与分页// 排序Direction direction = Direction.DESC;//directionStr为前端传值,asc代表正序if (&quot;asc&quot;.equals(directionStr)) { direction = Direction.ASC;}//默认使用datetime字段进行排序String sortProperty = &quot;datetime...原创 2018-11-12 22:42:31 · 6054 阅读 · 1 评论 -
SpringBoot实现多数据源动态切换
一.多数据源切换1.在配置文件中,配置3个不同的数据源,如下(项目使用的是druid数据库连接池):spring: datasource: druid: # 数据库连接1 datasource1: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://...原创 2020-04-23 14:47:28 · 1216 阅读 · 1 评论 -
SSM框架搭建详解
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架。它是继SSH之后,目前比较主流的Java EE企业级框架,适用于搭建各种大型的企业级应用系统。Spring:一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。关于控制反转和面向切面,网上有很多讲解的文章,感原创 2018-01-25 15:07:50 · 11180 阅读 · 5 评论 -
使用 iView 的 Page 组件实现 vue 分页(附后端分页实现)
随着页面数据越来越多,一次性加载所有数据会对后端服务造成压力,同时加载速度慢也会影响用户体验,所以我们通常使用分页的方式来提高性能,优化体验。很多其他博客中都是后端返回所有数据,前端再进行截取,个人认为这样并没有实现真正意义上的分页,所以本博客中由后端实现数据分页,前端只负责展示和处理。vue 分页可以通过 iView 的 Page 组件来实现,简单高效。一. vue 的 Page 组件实现前端分页1. 在 vue 文件中引入 Page 组件<template> <div&g原创 2021-01-27 11:11:12 · 2292 阅读 · 0 评论 -
springBoot集成Activiti6
数据库:mysqlIDE:Spring Tool Suitebuild工具:Maven项目版本:springBoot1.5.10 + JDK1.8 + Maven3.0.5 (之前用的是2.0.0版本的springBoot,集成activiti6后启动一直报错,最后发现是版本问题,改为1.5.10就可以了,迷之崩溃o(╥﹏╥)o)一.构建springBoot1.创建项目...原创 2018-04-10 14:49:31 · 33308 阅读 · 11 评论