java进阶部分笔记
文章平均质量分 80
java高级知识笔记
隐 风
你知道得越多,你不知道的也就越多。
展开
-
Synchronized和CAS加锁的区别
Synchronized和CAS加锁是Java中两种常见的锁机制,它们在实现方式、锁升级以及适用场景方面存在一些区别。原创 2023-10-24 23:56:34 · 441 阅读 · 0 评论 -
Mybatis事务如何跟Spring结合到一起?
在Java Web开发中,MyBatis和Spring是两个常用的框架,它们可以有效地结合在一起,提供强大的数据库事务管理功能。在本文中,我们将从数据库事务特性和Spring事务管理源码两个角度来分析MyBatis事务如何与Spring结合到一起的原理。原创 2023-10-12 22:16:27 · 2029 阅读 · 3 评论 -
Java并发编程之Future原理分析
在Java中,多线程编程是一种常见的编程模式,它允许程序同时执行多个线程,以提高程序的执行效率。然而,如果每个线程都创建和销毁线程,这将带来巨大的开销。为了解决这个问题,Java提供了线程池,它是一个重用的线程集合,可以减少创建和销毁线程的开销。Java并发编程之Future原理是Java线程池中的重要技术。通过使用Future,我们可以查询异步计算的结果,并在计算完成后采取相应的操作。在实现上,Java提供了FutureTask类来支持这一功能,它可以减少我们的工作量并提高代码的可读性。原创 2023-10-12 21:25:58 · 479 阅读 · 0 评论 -
Java多线程:Runnable与Callable的区别和原理
总的来说,Runnable和Callable都是用于实现多线程的工具,但它们的设计目的和使用场景是不同的。Runnable更适合用于执行简单的、不需要返回结果的任务,而Callable更适合用于需要返回计算结果的任务。在编写多线程程序时,我们需要根据实际需求选择适当的接口。在Java多线程编程中,我们经常使用Runnable和Callable接口来创建并执行线程。这两个接口都是Java.lang包中的部分,并且都用于实现多线程。在本文中,我们将深入探讨这两种接口的差异以及它们的工作原理。原创 2023-10-10 22:48:53 · 749 阅读 · 1 评论 -
Java线程通信:原理与简单示例
在Java中,线程之间的通信是一个非常重要的概念。这通常涉及到等待、通知和阻塞等机制。在多线程环境中,线程间的正确通信可以确保程序的流程顺利进行,数据的安全访问和共享。下面我们将深入探讨Java中的线程通信方式及其原理。原创 2023-10-10 22:36:52 · 296 阅读 · 0 评论 -
Java并发编程之ReentrantLock重入锁原理解析
ReentrantLock是Java并发编程库中的一个重要工具,它提供了一种可重入的互斥访问共享资源的方式。通过内部计数器来实现锁的占用情况的记录,同时支持公平锁和非公平锁两种策略以及可重入特性。使用ReentrantLock可以有效地避免并发访问共享资源时的线程安全问题。原创 2023-10-09 22:06:08 · 341 阅读 · 0 评论 -
CountDownLatch闭锁原理解析
在Java并发编程中,CountDownLatch是一个常用的工具类,用于实现闭锁(latch)。闭锁是一种常见的同步机制,用于控制线程的执行流程,确保某些线程在执行之前满足特定的条件。CountDownLatch尤其在多线程协作场景中非常重要,例如,当一个线程需要等待其他多个线程完成各自的工作后才能执行下一步操作时,CountDownLatch可以发挥巨大作用。原创 2023-10-09 21:56:55 · 315 阅读 · 0 评论 -
CyclicBarrier:Java并发编程中的循环屏障原理解析
CyclicBarrier是Java并发编程中的一个强大工具,允许一组线程互相等待,直到所有线程都到达某个屏障点。它适用于多种场景,如并行任务分发、复杂算法中的阶段控制等。通过理解和掌握CyclicBarrier,开发人员能够在多线程环境中实现更高效和更可控的任务执行模型。原创 2023-10-09 21:49:01 · 181 阅读 · 0 评论 -
Spring技术原理之Bean生命周期原理解析
Spring作为Java领域中的优秀框架,其核心功能之一是依赖注入和生命周期管理。其中,Bean的生命周期管理是Spring框架中一个重要的概念。在本篇文章中,我们将深入探讨Spring技术原理中的Bean生命周期原理,并通过简单的Java代码示例进行解析。原创 2023-10-09 21:46:33 · 276 阅读 · 0 评论 -
Java并发编程之ConcurrentHashMap原理解析
在Java中,ConcurrentHashMap是一种高效的多线程数据结构,用于在并发环境下实现安全的读写访问。自JDK 1.8开始,ConcurrentHashMap进行了重大改进,摒弃了分段锁(Segmentation Lock)的实现方式,转向使用CAS(Compare-and-Swap)和synchronized结合的方式来实现。同时,内部对于HashEntry也改为了Node,并且引入了红黑树(Red-Black Tree)的实现。下面我们将深入探讨ConcurrentHashMap的内部原理。原创 2023-10-09 21:40:12 · 116 阅读 · 0 评论 -
Spring事务与MyBatis事务的集成:通过ThreadLocal实现绑定
将Spring事务集成到MyBatis中,可以使我们在使用MyBatis进行数据库操作时,享受到Spring事务管理带来的便利。通过使用ThreadLocal,我们可以在SqlSession执行时获取到事务信息,从而在事务中执行数据库操作。通过配置Spring的事务管理器,以及在业务逻辑层和MyBatis的Mapper接口中使用@Transactional注解,我们可以方便地控制事务的开始、提交和回滚。以上是一个简单的示例,实际使用中还需要考虑到更多的因素。原创 2023-10-09 21:17:34 · 1773 阅读 · 4 评论 -
LinkedBlockingQueue:Java并发编程的强大工具
在Java并发编程中,LinkedBlockingQueue是一个非常重要的数据结构,它是一个线程安全的队列,能够有效地管理和控制多线程环境中的任务。本文将介绍LinkedBlockingQueue的工作原理、应用场景以及简单示例,帮助你更好地理解并发编程中的LinkedBlockingQueue。原创 2023-10-08 22:44:17 · 405 阅读 · 0 评论 -
Java线程池:并发编程的利器
Java线程池是一种预先创建一定数量的线程,并将任务提交给这些线程执行的机制。它能够有效地管理线程的创建、销毁和执行,避免了大量线程的频繁创建和销毁,提高了应用程序的性能和响应速度。线程池可以适用于需要执行大量异步任务的情况,例如服务器处理请求、应用程序的并行计算等。原创 2023-10-08 22:30:56 · 570 阅读 · 0 评论 -
JVM垃圾回收之JVM GC算法探究
JVM 的垃圾回收机制是 JVM 自动内存管理的重要组成部分,它能够有效地回收不再使用的对象,避免内存泄漏和内存溢出等问题。而垃圾回收机制的核心就是 GC 算法和 GC Roots 定位算法。了解和掌握这些算法的原理和机制有助于我们更好地理解和使用 JVM。原创 2023-10-08 22:26:57 · 640 阅读 · 1 评论 -
SpringBoot 核心原理分析
spring-boot-loadermaven将SpringBoot启动类打到fatJarJarLauncherSpringApplicationSpringBoot项目的入口启动类:@SpringBootApplicationpublic class BootApplication { public static void main(String[] args){ SpringApplication.run(BootApplication.class,args原创 2021-10-24 11:20:47 · 5613 阅读 · 4 评论 -
Spring事务
数据库事务ACIDA (Atomicity) 原子性: 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。C (Consistency) 一致性: 一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。I (Isolation) 隔离性: 所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提原创 2021-10-22 20:34:53 · 3269 阅读 · 0 评论 -
Spring技术原理之Spring AOP
静态代理:问题:每个RealSubject对应编写一个Proxy类,比较麻烦。大量的Proxy类会导致类规模增大不易维护,影响编译动态代理:两个问题:自动生成的Proxy类如何代理实体类?运行时如何生成Proxy类?自动生成的Proxy类如何代理实体类?定义一个全局的公共代理类:ProxyProxy类可以根据实体类RealSubject或者实体类的接口来生成一个功能增强的具体代理类(xxxProxy)。注:通过接口生成-JDK动态代理,通过继承生成-原创 2021-10-21 09:00:00 · 3256 阅读 · 0 评论 -
Spring技术原理之Spring IOC
依赖倒置原则: 依赖倒置的核心是面向接口编程定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。问题由来:类A直接依赖类B,假如要将类A改为依赖类C,则必须通过修改类A的代码来达成。这种场景下,类A一般是高层模块,负责复杂的业务逻辑;类B和类C是低层模块,负责基本的原子操作;假如修改类A,会给程序带来不必要的风险。解决方案:将类A修改为依赖接口I,类B和类C各自实现接口I,类A通过接口I间接与类B或者类C发生联系,则会大大降低修改类A的几率。控制反转(I原创 2021-10-19 21:59:27 · 3437 阅读 · 0 评论 -
java设计模式之行为型设计模式
行为型设计模式:责任链(Chain of Responsibility):用途:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。场景:有多个对象可以处理一个请求,哪个对象处理该请求运行时自动确定。你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。可处理一个请求的对象集合被动态指定。结构图已知应用Java Servlet : 1 FilterChain = n原创 2021-10-16 12:21:05 · 3493 阅读 · 0 评论 -
java设计模式之结构型设计模式
结构型设计模式:适配器(Adapter):用途:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。场景:你想使用一个已经存在的类,而它的接口不符合你的需求。你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。此时可以适配它的父类接口。结构图:通过持有该对象的引用来适配已知应用JDK中InputStreamReader:StreamDecoder实现了InputStream到Rea原创 2021-10-16 12:20:15 · 3641 阅读 · 0 评论 -
java设计模式之创建型设计模式
创建型设计模式:抽象工厂(Abstract Factory):用途:提供一个接口以创建一系列相关或相互依赖的对象,而无需指定具体的类。场景:一个系统要独立于它的产品的创建。一个系统要由多个产品系列中的一个来配置。强调一系列相关的产品对象的设计以便进行联合使用。提供一个产品类库,但只对外提供它们的接口而不是实现结构图: 创建一系列相关的对象已知应用:JDK中的Collection,Map工厂方法(Factory Method):用途:定义一个用于创建对象的接原创 2021-10-16 12:19:20 · 3407 阅读 · 0 评论 -
Netty之四种常用 IO 模型
四种常用 IO 模型:同步阻塞 BIO: 最简单的 IO 模型,用户线程在读写时被阻塞.数据拷贝指请求到的数据先存放在内核空间, 然后从内核空间拷贝至程序的缓冲区.用户线程在 IO 过程中被阻塞,不能做任何事情,对 CPU 的资源利用率不高.同步非阻塞 NIO: 用户线程不断发起 IO 请求. 数据未到达时系统返回一状态值; 数据到达后才真正读取数据.用户线程每次请求 IO 都可以立即返回,但是为了拿到数据,需不断轮询,无谓地消耗了大量的 CPU. 一般很少直接使用这种模型,而是在其原创 2021-10-16 12:06:23 · 4202 阅读 · 0 评论 -
java8新特性之Stream流
Stream 接口:List<String> stringCollection = new ArrayList<>();stringCollection.add("ddd2");stringCollection.add("aaa2");stringCollection.add("bbb1");stringCollection.add("aaa1");stringCollection.add("bbb3");stringCollection.add("ccc");str原创 2021-10-15 22:26:53 · 3309 阅读 · 0 评论 -
Java8新特性之Lambda
接口的默认方法:Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法interface Formula { double calculate(int a); default double sqrt(int a) { return Math.sqrt(a); }} 例子: Formula接口在拥有calculate方法之外同时还定义了sqrt方法,实现了Formula接口的子类只需要实现一个calc原创 2021-10-15 22:25:53 · 3379 阅读 · 2 评论 -
Java并发编程之Semaphore信号量
Semaphore:Semaphore基于AQS的共享模式实现,主要用于在总体许可(permits)一定的情况下,限制线程的并发访问,可用于实现:服务限流。获取permits的过程:如上图所示,共有四个线程同时获取许可(permits),总许可数为10。按照获取的时间顺序,Thread1获取3个许可,Thread2获取6个许可,Thread3获取3个许可,Thread4获取2个许可。显然Thread1和Thread2能够顺利获取许可并执行,但是Thread3要获取3个许可,此时Semapho原创 2021-10-14 22:06:18 · 3273 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSychronizer(抽象队列同步器,简称AQS)
AbstractQueuedSychronizer(抽象队列同步器,简称AQS):JDK的并发包(包名:java.util.concurrent,以下简称JUC)下面提供了很多并发操作的工具类,如:ReentrantLock,CountDownLatch等。这些并发操作工具类的基础是AbstractQueuedSychronizer*AQS内部维护了一个共享资源和两个队列:*一个是同步队列;一个是条件队列。public abstract class AbstractQueuedSynchron原创 2021-10-14 21:12:21 · 3589 阅读 · 0 评论 -
Java并发编程之调度线程池
调度线程池:调度线程池是线程池类ThreadPoolExecutor的子类,复用了线程池的计算框架,主要用于解决任务在一定的时间间隔后重复执行的问题。例子public class ScheduledThreadPoolTest { /** * 以固定的频率调度,包括任务执行的时间 */ public static void scheduledAtFixRate(){ ScheduledExecutorService scheduledEx原创 2021-10-14 21:07:34 · 4369 阅读 · 0 评论 -
Java并发编程之Thread类详解
Thread类详解:线程(Thread): 是操作系统进行调度的最小单位,Java中的线程是对操作系统线程的封装。本文从线程的创建到停止结合代码和具体实例分析一下关于java线程的一些常见问题。线程的创建:自己写一个类继承于java.lang.Thread类,并重写run()接口实现java.lang.Runnable接口,并传给Thread的构造函数。//方式1class MyThread extends Thread{ @Override public void原创 2021-10-14 20:46:06 · 3383 阅读 · 0 评论 -
jvm垃圾回收之垃圾收集器
概念:图中展示了7种不同分代的收集器:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS、G1;而它们所处区域,则表明其是属于新生代收集器还是老年代收集器:新生代收集器:Serial、ParNew、Parallel Scavenge;老年代收集器:Serial Old、Parallel Old、CMS;整堆收集器:G1;两个收集器间有连线,表明它们可以搭配使用:Serial/Serial Old、Serial/CM..原创 2021-10-13 22:26:10 · 3515 阅读 · 2 评论 -
jvm垃圾回收之类加载机制
类的生命周期:加载:.class文件(二进制数据)——>读取到内存——>数据放进方法区——>堆中创建对应Class对象——>并提供访问方法区的接口验证、准备、解析:验证主要是用来检查class文件格式是否正确准备阶段:为类变量分配内存public static int test = 100; //准备阶段,test=0; public int test2 = 100;public static final int test3 = 100; //准备阶..原创 2021-10-13 22:19:51 · 3301 阅读 · 0 评论 -
java内存模型
CPU工作原理:单核CPU工作原理-高速缓存:cpu读取数据时按照L1,L2,L3,物理内存的顺序依次查找L1,L2,L3的速度依次递减,容量依次递增多核CPU工作原理-高速缓存:并发编程问题:缓存一致性问题:多核多线程并行执行导致L1,L2缓存数据不一致举个栗子:结果分析:编译器优化和指令重排:上述1属于编译器重排序,2,3属于处理器重排序。重排序会导致多线程程序出现内存可见性问题。举个栗子-重排序:执行完成后 i = 1或者0publi原创 2021-10-13 22:11:50 · 3272 阅读 · 0 评论