
JAVA
文章平均质量分 74
yue_hu
成长源于积累
展开
-
【小笔记】MyBaits的Cursor
流式查询 指的是查询成功后不是返回一个集合而是返回一个迭代器,应用可以通过迭代器每次取一条查询结果。流式查询的好处是能够降低内存使用。例如我们想要从数据库取 1000 万条记录而又没有足够的内存时,就不得不分页查询。而分页查询就需要我们按照顺序查询并设置一个参数来记录当前进度并在下次查询时将进度作为参数传入(比如按id升序查询,记录每次查询结果的最大id, 下次查询将这个最大id传入只查询大于这个id的),否则就会出现深度分页的情况。原创 2023-11-07 16:16:06 · 905 阅读 · 0 评论 -
【小笔记】webhook是什么
webhook不是一项技术,他只是一个概念。原创 2023-02-16 09:58:03 · 517 阅读 · 0 评论 -
【小笔记】一种@Reference 注入为null的情况与排查过程
这里要注意,如果你依赖的服务Service里面存在ClassNotFound,而你在本项目中又没有用到这个Class,那在启动过程中,并不会报错,应用也会正常部署。Dubbo对于这种情况也仅仅是打印一个Warning级别的日志而不会影响部署进程。这个日志很可能会淹没在大量的启动日志里面。因此对于这类问题,可以考虑调整一下日志级别,然后查询关键日志条目的上下内容,也许能帮助我们发现蛛丝马迹。我这里排查的是应用部署成功,同一个包下面其它服务都能正确初始化,唯独一个服务TESTXXX无法初始化。原创 2023-02-14 18:50:28 · 559 阅读 · 0 评论 -
【杂记】rocketmq-spring-boot:2.0.3的无法部署与参数解析错误bug
因为rocketmq-spring-boot在初始化时会用DefaultRocketMQListenerContainer.getMessageType方法通过反射获取RocketMQListener接口以获取泛型参数(就是onMessage的入参类型)。如果继承了接口,但是不包含RocketMQListener接口,则会导致参数类型解析错误。因此如果使用的rocketmq-spring-boot:2.0.3使用的时间要注意。否则会导致死循环或者参数类型解析错误。当然更好的方法是做组件升级。原创 2023-02-13 17:21:24 · 389 阅读 · 0 评论 -
【JAVA核心知识】46:什么是零拷贝Zero-copy
零拷贝相较于传统的IO流程拥有更高的数据发送效率,无论是RocketMq,Kafka还是Netty等都用到了零拷贝技术,那究竟什么是零拷贝呢,零拷贝又是通过什么方式提升数据发送效率呢?首先我们要明白,一次数据发送过程就是将磁盘中的目标数据交给网卡传输出去的流程。磁盘以及网卡都属于硬件层。而应用程序是不能直接操作硬件的。如果要操作硬件,需要进行上下文切换从用户态切换到内核态由操作系统来完成硬件交互。关于用户态,内核态,上下文切换这些这里不再赘述。原创 2023-01-30 18:58:34 · 759 阅读 · 0 评论 -
简简单单一段话描述设计模式
设计模式的概念由著名建筑师Alexander提出:每个模式都描述了一个在我们周围不断发生的问题,然后描述了该问题的解决方案的核心,通过这种方式,我们可以无数次的重用那些已有的解决方案而不必再做重复性的工作。这一概念同样适用于软件开发领域。设计模式并不是一种技术,而是特定场景下解决问题的一种方案。在软件开发领域,设计模式(Design Pattern)是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结。使用设计模式是为了可重用代码(重用性),让代码更易理解(可读性),保证代码的可靠性。原创 2022-09-30 17:07:48 · 495 阅读 · 0 评论 -
石杉的架构笔记-阅读记录【持续更新...】
最近发现一个宝藏博主:[石杉的架构笔记]。博文质量很高,打算通篇阅读一下。这里针对每篇博文大致做一下内容简介以便后面快速检索以及查漏补缺。原创 2022-07-10 19:37:01 · 938 阅读 · 0 评论 -
【小笔记】Spring构造方法@Autowired注入的对象为null
如果这样配置OuterBean的构造方法<bean id="OuterBean" class="com.test.OuterBean"> <constructor-arg name="par"> <list> <value>一二三四五</value> </list> </constructor-arg>原创 2021-12-10 15:56:20 · 1195 阅读 · 0 评论 -
【小笔记】LongAdder和AtomicLong
多个线程更新用于收集统计信息而不是细粒度同步控制的公共和时,LongAdder通常比AtomicLong更可取。在低级别争用下,这两个类具有相似的特性。但在高争用情况下,LongAdder的预期吞吐量明显更高,这是以更高的空间消耗为代价的。AtomicLong内部直接使用CAS完成原子化加算:public final long getAndAdd(long delta) { return unsafe.getAndAddLong(this, valueOffset, delta);}public原创 2021-10-11 17:56:36 · 190 阅读 · 0 评论 -
【小笔记】XStream格式化XML将类成员作为节点属性
为属性加上@XStreamAsAttribute注解,可以让类成员作为父节点属性输出示例:@XStreamAlias("testBean")class xmlTestBean { private String fe1; @XStreamAsAttribute private String fe2; public xmlTestBean(String fe1, String fe2) { this.fe1 = fe1; this.fe2 = fe2; }}public stati原创 2021-10-09 17:36:52 · 802 阅读 · 0 评论 -
【小笔记】identityHashCode
如果你没有重写对象的HashCode方法,使用的是Object的native int hashCode(),那么返回的hashCode就是identityHashCode,即使重写了HashCode,也可以通过System.identityHashCode(Object x)获得identityHashCode。也许你可以重写hashCode()方法让对象在不同状态返回不同的Hash值,但是一个对象的identityHashCode一经计算就永远不会改变。identityHashCode会在第一次计算时存入原创 2021-09-17 17:52:58 · 617 阅读 · 0 评论 -
【小笔记】CAP原则
CAP原则:CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)最多能实现2个,不能3者兼顾。一致性(Consistency):所有数据节点在任意时刻数据都是一致的。可用性(Availability):在任何时间都处于可用状态,总是能对请求进行响应,而不阻塞或报错。分区容忍性(Partition tolerance):系统中分区间通信出现问题时或部分分区宕机时,活动的分区依然能够原创 2021-09-16 15:48:50 · 263 阅读 · 0 评论 -
【JAVA核心知识】22:从源码看ReentrantLock的Condition
在[22-F.1:Condition的简单使用]中介绍了Condition的简单使用及常用方法,Condition在JDK 1.5引入与ReentrantLock结合使用可以对线程进行主动控制,相较于Object的wait(),notify()方法,Condition具有更全面的功能。原创 2021-08-26 11:49:47 · 1052 阅读 · 0 评论 -
【JAVA核心知识】21:从源码看ReentrantLock
前言RenentrantLock在JDK1.5引入,是一个可以设置公平性的可重入锁。ReentrantLock implements Lock, java.io.Serializable原创 2021-08-26 11:47:12 · 502 阅读 · 0 评论 -
【JAVA核心知识】22-F.1:Condition的简单使用
目录前言Condition的方法介绍示例代码关联导航前言在??????介绍了ReentrantLock的简单使用,可以简单的认为ReentrantLock是功能更加全面的synchronized的API形式。那么ReentrantLock的阻塞(synchronized的wait)和唤醒(synchronized的notify)如何实现呢,此时就需要和ReentrantLock一样在JDK 1.5引入的Condition出马了,相较于Object的wait(),notify()方法.原创 2021-08-26 11:44:35 · 291 阅读 · 0 评论 -
【JAVA核心知识】21-F.1:ReentrantLock的简单使用
目录加锁与解锁示例代码lock(),tryLock()与unlock()的简单使用:lock(),lockInterruptibly(),tryLock(long timeout, TimeUnit unit)对中断的反应:ReentrantLock的其它常用方法示例代码关联导航ReentrantLock是一个API级别的可重入锁。不同于synchronized仅支持非公平模式,ReentrantLock可以在构造时指定这个锁是公平模式还是非公平模式。加锁与解锁Re.原创 2021-08-26 11:42:56 · 489 阅读 · 0 评论 -
web应用通过request设置(获取)application级别的属性
设置request.getSession().getServletContext().setAttribute(String name, Object object)获取request.getSession().getServletContext().getAttribute(String name)原创 2021-08-20 18:01:09 · 373 阅读 · 0 评论 -
RSA报错javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes原因
出现这个异常第一个可能是信息太长,此时可以考虑采用分段加密的方式第二个可能是并发问题,Cipher是线程不安全的,如果出现并发就可能报以上异常原创 2021-08-19 17:36:04 · 5504 阅读 · 0 评论 -
RSA加密的简单使用
RSA是一种非对称加密,发送方用公钥加密,接收方用私钥解密。只要私钥不泄漏,即使获得了公钥和数据,也无法进行解密。RSA的安全性依赖于大整数因式分解的困难,目前已知被分解的最大整数为768个二进制位,也就是说已知能被破解的最大RSA秘钥为768位,但是一般情况都采用1024位的秘钥,重要数据使用2048位的秘钥(当然安全性的提升要付出更多的解密时间)。首先生成公钥和私钥:public static void main(String[] args) { try { KeyPairGenerator原创 2021-08-19 12:15:24 · 3739 阅读 · 0 评论 -
【JAVA核心知识】20-F.1:synchronized/wait/notify的简单使用
一:修饰代码块二:修饰方法修饰静态方法修饰非静态方法修饰方法的继承三:wait和notify的使用用synchronized修饰代码块或方法即可完成同步,synchronized的使用方法有以下几种。一:修饰代码块修饰代码块时需要明确指定锁对象,锁住的时所有以该锁对象为锁的代码块public void method1() { synchronized (lockObj) { // action1 }}public void method2() { syn原创 2021-07-20 19:56:05 · 456 阅读 · 1 评论 -
【JAVA核心知识】20:synchronized实现原理与锁膨胀:无锁or偏向锁-轻量级锁-重量级锁,看完就懂
synchronized前言JDK对Synchronize的优化-锁膨胀偏向锁轻量级锁重量级锁重量级锁模式下的SynchronizeSynchronize 的核心组件Synchronized 的流程Synchronized 的实现Synchronized 的作用范围synchronized的简单使用前言Synchronized是通过对象内部的monitor(监视器锁)来实现的。monitor本质上又是依赖于底层操作系统的Mutex Lock来实现的,操作系统实现线程之间的切换依赖于操作系统 Mutex原创 2021-07-19 17:56:59 · 1628 阅读 · 4 评论 -
【JAVA核心知识】19:JAVA中的各种锁
JAVA中的各种锁乐观锁与悲观锁乐观锁悲观锁举个例子独占锁与共享锁独占锁共享锁ReadWriteLock读写锁自旋锁自旋的优点自旋的缺点自适应自旋锁公平锁与非公平锁公平锁非公平锁举个例子为什么非公平锁不是唤醒全部等待线程进行争抢呢?为什么非公平锁比公平锁拥有更高的性能呢可重入锁分段锁无锁&偏向锁&轻量级锁&重量级锁为什么Synchronized重(效率低)?锁膨胀锁的优化途径减少锁的持有时间锁粗化减小锁粒度锁分离锁消除Java提供了丰富的锁,每种锁都有各自的特性,合理的利用锁能显著原创 2021-07-08 15:59:35 · 548 阅读 · 0 评论 -
【JAVA核心知识】18:线程本地变量-ThreadLocal
ThreadLocal是JDK1.2引入的类,用来提供线程内的局部变量。不同于普通变量,线程本地变量原创 2021-06-17 16:58:17 · 925 阅读 · 6 评论 -
【JAVA核心知识】17.2:线程间通信协作-Exchanger
JDK1.5提供了用于两个线程间通信协作的工具类Exchanger。通过Exchanger可以在两个线程之间进行数据交换,且需要两个线程都到达交换节点时才开始进行数据交换,否则先到达交换节点的线程会处于等待状态等待另一个线程执行交换动作。Exchanger定义为Exchanger<V>,V为泛型,为期望交换的数据类型,Exchanger是一个很简单的类:Exchanger():构造方法V exchange(V x):执行交换动作,入参为要发送的数据,返回为接到的交换数据。如果执行时没有其原创 2021-06-15 16:58:54 · 1262 阅读 · 6 评论 -
【JAVA核心知识】17.1:线程间变量共享
变量共享是进行线程间通信的常用手段之一,java的内存模型(JMM)解决了可见性和有序性,我们则可以通过线程锁保证原子性。共享继承Runnable将变量作为成员变量将变量定义为final直接访问有变量:class ShareData { int num = 0; public synchronized void inrc() { num++; } public synchronized void desc() { nu原创 2021-06-15 15:38:52 · 3408 阅读 · 13 评论 -
【JAVA核心知识】16:volatile关键字:变量可见性与禁止重排序
volatile1 变量可见1.1 什么是变量可见性1.2 为什么会有变量可见性的问题1.3 volatile的变量可见性2 禁止重排序2.1 什么是重排序2.2 为什么要重排序2.2.1 编译器为什么要重排序2.2.2 处理器为什么要重排序2.3 重排序在多线程下的问题2.3.1 编译器下的重排序可能出现的问题2.3.2 处理器下的重排序可能存在的问题3 volatile的使用4 synchronized有禁止指令重排序和变量可见性的功能吗volatile提供了一种稍弱的同步机制,用来确保线程获取到的变原创 2021-06-15 10:39:52 · 1003 阅读 · 2 评论 -
【JAVA核心知识】15.3:线程控制器Semaphore
Semaphore简介常用方法示例简介多用于线程多于资源下的资源控制的线程控制器。很像锁同步,和锁同步不同的是锁锁定一个资源,同时只能有一个线程操作这个资源。而Semaphore则是锁定一批资源。同时只允许指定数目的线程执行操作。也与线程池有一定相似。不同的是线程池等待的线程未运行,而这个线程已经在运行并且在争夺。适用于资源量小于线程量的情况。比如一个连接只允许同时有10个线程连接,现在有100个线程要执行这个连接操作,那么就可以用Semaphore进行控制。常用方法Semaphore(int原创 2021-06-09 17:49:43 · 367 阅读 · 2 评论 -
【JAVA核心知识】15.2:线程控制器CyclicBarrier
简介可重复使用的线程控制器、适用于多个线程需到达某个状态之后再同时开始执行的场景,就好似有道屏障,只有在屏障处等待的线程到指定数量这个屏障才会打开。常用方法CyclicBarrier(int parties, Runnable barrierAction):构造方法,parties标识要控制的线程数,即当多少个线程在屏障处等待时就放行。barrierAction为需要在放行时同步执行的操作。CyclicBarrier(int parties):构造方法,parties标识要控制的线程数,即当多少原创 2021-06-09 17:15:53 · 230 阅读 · 0 评论 -
【JAVA核心知识】15.1:线程控制器CountDownLatch
CountDownLatch简介常用方法示例简介CountDownLatch像是一个计数器,适用于主线程要等待子线程执行完之后才继续执行的场景。它是不可重用的,每次使用只能重新构造。常用方法CountDownLatch(int count) : 构造方法,入参指定线程控制量,即要等待几个子线程执行完毕(准确的说是要执行几次countDown使得count为0)之后等待线程才能继续执行void countDown():每次执行count减1,一般作为线程的最后一个步表示当前线程执行完毕void原创 2021-06-09 17:02:55 · 442 阅读 · 0 评论 -
【小笔记】为什么使用BigDecimal计算出来的结果依然不精准
BigDecimal错误错误示例产生原因解决方案错误示例日常开发中,我们都会选择BigDecimal进行针对小数的运算以获得精准的结果,但是有时即使使用了BigDecimal,得出来的结果依然不精准。如:public static void main(String[] args) { BigDecimal subVal = new BigDecimal(1.3).subtract(new BigDecimal(1)); System.out.println(subVal.double原创 2021-05-12 10:30:03 · 1018 阅读 · 0 评论 -
【JAVA核心知识】13:一文看懂JAVA线程池,轻松应对面试
JAVA线程池解析1 线程池原理1.1 线程复用1.2 线程池的组成2 线程池的核心参数3 线程池的工作过程4 线程池的状态4.1 状态转换条件5 JAVA中提供的线程池5.1 基础线程池5.1 定时线程池5.1.1 定时线程池如何实现定时线程如何实现定时线程池的常用方法在上一篇线程基础中提到,在需要使用多线程执行任务时就可以通过创建额外的线程来实现,但是如果任务很多且执行任务较短,那么就需要频繁的创建与销毁线程,使得应用的处理效率大大降低。为了应对这种场景,线程池应运而生。1 线程池原理线程池的工作原创 2021-04-30 11:01:57 · 529 阅读 · 0 评论 -
【JAVA核心知识】14:JAVA线程池常用方法
JAVA线程池常用方法1 常用方法1.1 基本线程池1.2 定时线程池2 代码示例2.1 基本线程池2.2定时线程池上一篇【JAVA核心知识】13:JAVA线程池解析中对线程池进行了剖析,了解线程池的核心参数与实现可以更清楚的了解每个方法所代表的意义。1 常用方法1.1 基本线程池prestartCoreThread():初始化一个核心线程; 每次都是初始化一个,始化到最大核心线程数时就不再初始化新的了getPoolSize():获得当前线程量(包含核心线程和临时线程)getCorePoolS原创 2021-04-30 10:59:38 · 903 阅读 · 4 评论 -
【JAVA核心知识】12:线程基础
定义线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,同一进程中的多条线程将共享该进程中的全部系统资源。线程是独立调度和分派的基本单位。 – 百度百科创建一个线程继承Thread类实现Runnable接口...原创 2021-04-26 16:52:25 · 335 阅读 · 0 评论 -
【JAVA核心知识】12-F.1:sleep与wait在释放锁上的区别
Sleepsleep是Thread类中的静态方法,调用sleep会使得当前线程睡眠一段时间。睡眠状态开始时放弃对CPU的掌控,并在睡眠持续期间不再抢夺CPU计算资源,但是睡眠状态并不会释放持有的锁资源。可以认为睡眠只是暂时停滞,期间除了线程不做任何动作之外其他特性和正常运行时并没有很大的差别(锁什么的都拿着)。调用sleep需要捕获InterruptedException避免数据期间设置中断标识。验证验证sleep期间不会释放锁资源:public static void main(String[]原创 2021-04-25 15:34:38 · 796 阅读 · 0 评论 -
【JAVA核心知识】11: 从源码看ConcurrentHashMap:一文看懂ConcurrentHashMap
前言ConcurrentHashMap是基于Hash表的Map接口实现,键与值均不允许为NULL,他是一个线程安全的Map。同时他也是一个无序的Map,不同时间进行遍历可能会得到不同的顺序。在JDK1.8之前,ConcurrentHashMap使用分段锁以在保证线程安全的同时获得更大的效率。JDK1.8开始舍弃了分段锁,使用自旋+CAS+sync关键字来实现同步。本文所述便是基于JDK1.8。ConcurrentHashMap与HashMap有共同之处,一些HashMap的基本概念与实现,本文不再赘述。原创 2021-04-07 18:01:53 · 534 阅读 · 2 评论 -
【小笔记】从源码看jdk1.8之前的HashMap为什么会产生死锁
总所周知HashMap不是一个线程安全的Map,并发情况下可能会出现数据丢失,除此之外,JDK1.8之前的HashMap在并发场景下还可能产生死锁。JDK1.8之前为什么会产生死锁:想要了解产生死锁的原因是首先要了解JDK1.8之前的HashMap扩容原理,因为死锁正是由多个线程同时进行扩容操作导致的,HashMap底层容器为一个Entry[]数组,扩容就是建立一个目标容量的新数组,并将元素重新放到新数组内,并将新数组赋值为容器即完成了扩容,产生死锁的关键就在于从旧数组转移元素到新数组,JDK1.8之前原创 2021-03-22 09:30:15 · 843 阅读 · 0 评论 -
【JAVA核心知识】10: 从源码看HashSet:一文看懂HashSet
前言HashSet是基于Hash表的Set接口实现,允许空值和空键,非线程安全的Set。HashSet是一个无序集合,无序不仅仅是指存储顺序可能与插入顺序不同,还包括元素的存储位置可能会随着对实例的使用而变换。阅读这篇博文之前,请先阅读【JAVA核心知识】9:从源码看HashMap:一文看懂HashMap因为HashSet是通过HashMap实现的。 前言1 HashSet的继承关系2 HashSet的参数3 HashSet的构造3.1 无参构造3.2 带有初始元素的构造3.3 带有初始容量和装载因原创 2021-01-28 17:47:31 · 202 阅读 · 0 评论 -
【JAVA核心知识】9: 从源码看HashMap:一文看懂HashMap
前言:HashMap是基于Hash表的Map接口实现,允许空值和空键,非线程安全的Map。HashMap不保证顺序,不保证顺序不仅仅是指存储顺序可能与插入顺序不同,还包括元素的存储位置可能会随着对实例的使用而变换。从源码看HashMap前言:1 HashMap的参数1.1 容量1.1.1 默认初始容量1.1.2 最大扩容容量1.1.3 最小树化容量1.2 装载因子1.2.1 默认装载因子1.3 阈值1.3.1 扩容阈值1.3.2 树化阈值1.3.3 树退化阈值1.4 大小1.5 modCountHash原创 2021-01-22 17:26:27 · 833 阅读 · 2 评论 -
【JAVA核心知识】8: 从源码看LinkedList:一文看懂LinkedList
LinkedList是java集合框架下的成员,底层数据基础为双向链表,非线程安全集合从源码看LinkedList1 LinkedList的继承实现2 LinkedList的数据基础2 LinkedList的初始化2.1 无参构造2.1 带有初始元素集合的构造3 LinkedList的元素新增示例3.M.1 addAll(int index, Collection<? extends E> c)3.M.2 add(int index, E element)4 LinkedList的元素删除示例原创 2021-01-12 15:56:43 · 509 阅读 · 0 评论 -
【JAVA核心知识】7: 从源码看ArrayList:一文看懂ArrayList
List是有序的Collection,ArrayList是最常用的List实现类,原创 2021-01-07 16:08:45 · 215 阅读 · 1 评论