- 博客(161)
- 资源 (1)
- 收藏
- 关注
原创 数据库操作之Left Join
Left Join(左外连接)是数据库查询中常用的连接方式,其核心规则是以左表为基准,保留左表所有记录,右表无匹配则返回NULL值。基本语法包括指定连接条件(ON子句),与WHERE过滤条件不同,ON不影响左表记录的保留。与Inner Join相比,Left Join会保留左表不匹配记录,适用于查找未关联数据、展示主表及可选附属信息、生成完整报表等场景。典型应用如查询无订单客户(WHERE右表ID为NULL)或显示用户信息及可能为空的头像。
2026-01-12 13:05:23
165
原创 数据库INNER JOIN简介
联表查询是数据库操作中常见需求,其中INNER JOIN是最基础的连接方式,用于提取多表间的匹配数据。文章介绍了INNER JOIN的特性:仅返回满足关联条件的交集数据,INNER关键字可省略为JOIN。详细说明了基本语法结构,包括两表和多表连接方式,并通过用户表和订单表的实例演示了查询方法。特别强调了关联条件(ON子句)的必要性,避免产生笛卡尔积;建议使用表别名简化SQL;WHERE子句可用于结果过滤;关联字段应建立索引优化性能。与其他连接方式的区别在于INNER JOIN仅保留完全匹配的记录,结果集更精
2026-01-10 20:23:11
360
原创 Java 通过不可变的共享对象实现线程安全
摘要:通过创建不可变对象实现线程安全,对象一旦创建后其状态不可修改。示例中ImmutableValue类通过构造函数初始化值且不提供set方法,任何修改操作都返回新实例。但需注意引用该对象的容器类(如Calculator)可能仍存在线程安全问题,需通过同步方法确保线程安全。不可变对象本身是线程安全的,但其引用仍需额外保护。
2026-01-09 13:34:35
117
原创 Java中多线程异步调用
本文介绍了Java中实现异步编程的两种方式:通过Thread类和Runnable接口创建线程。异步编程适用于耗时操作(如视频格式转换、Servlet处理等),能避免主线程阻塞。第一种方式直接继承Thread类并重写run方法;第二种方式将任务(Runnable)与线程(Thread)分离,更符合面向对象设计。两种方式都通过匿名内部类实现,示例代码展示了线程创建、命名和启动过程,并利用Thread.sleep确保主线程与新线程的顺序执行。这种方式能有效提升程序响应性和资源利用率。
2026-01-09 08:44:56
118
原创 Java线程中断的方法
摘要:Java线程中断机制主要通过interrupt()、isInterrupted()和interrupted()三个方法实现。interrupt()设置中断状态但不强制终止线程;isInterrupted()检测中断状态;interrupted()清除中断状态。当线程被阻塞时,interrupt()能抛出InterruptedException唤醒线程。最佳实践是结合中断状态检查和volatile开关变量控制线程终止,同时注意处理阻塞状态下的中断异常。
2026-01-09 08:35:41
179
原创 Java FutureTask详解
摘要:FutureTask是实现了Future和Runnable接口的异步计算工具,适用于耗时任务。它具有未启动、已启动和已完成三种状态,通过get()获取结果时会根据状态决定是否阻塞线程。在高并发场景下,结合ConcurrentHashMap使用FutureTask能确保任务只执行一次,既避免了锁的性能损耗,又防止了重复创建资源的问题,如数据库连接池中的连接创建。示例代码展示了如何通过FutureTask实现线程安全的单次任务执行机制。
2026-01-08 14:06:50
595
原创 Java ScheduledThreadPoolExecutor详解
ScheduledThreadPoolExecutor是基于ThreadPoolExecutor的定时任务执行器,相比Timer更灵活强大。它通过DelayQueue存储任务,使用PriorityQueue按执行时间排序任务。执行过程包含四个步骤:获取到期任务、执行任务、更新下次执行时间、重新放入队列。任务排序规则是时间早的优先,时间相同则按提交顺序。由于使用无界队列,maximumPoolSize参数不生效。该机制实现了周期性任务的高效调度。
2026-01-08 08:45:50
730
原创 Java ThreadPoolExecutor详解
摘要:ThreadPoolExecutor是Java线程池的核心实现类,由核心线程数、最大线程数、工作队列和拒绝策略组成。Executors工具类可创建三种线程池:1)FixedThreadPool固定线程数,使用无界队列;2)SingleThreadExecutor单线程执行,保证任务顺序;3)CachedThreadPool动态调整线程数,使用SynchronousQueue实现任务传递。三种线程池在核心线程数、队列类型和线程回收策略上各有特点,适用于不同并发场景。其中CachedThreadPool适
2026-01-08 08:40:08
771
原创 Java Executor框架
Java线程模型与Executor框架概述 JDK5引入了Executor框架,将线程的工作单元与执行机制分离。工作单元包括Runnable和Callable接口,执行机制由Executor框架提供。该框架采用两级调度模型:上层应用将任务映射到固定线程数,底层操作系统将线程分配到CPU处理器。核心组件包括: 任务接口(Runnable/Callable) 执行接口(Executor/ExecutorService)及其实现类(ThreadPoolExecutor/ScheduledThreadPoolExe
2026-01-08 08:34:59
484
原创 Java中的并发工具类之同步屏障CyclicBarrier
CyclicBarrier是Java中一种可循环使用的线程同步工具,它会让一组线程在屏障点等待,直到所有线程都到达后才继续执行。与CountDownLatch不同,CyclicBarrier可以重复使用,且支持设置优先执行的barrierAction。示例展示了基本用法和银行流水统计的应用场景:4个线程分别处理Excel的4个sheet,待所有线程完成后汇总结果。CyclicBarrier适用于多线程分阶段处理数据后合并结果的场景,其构造函数可指定触发屏障时优先执行的任务,实现更复杂的业务逻辑。
2026-01-07 12:25:32
221
原创 Java中的并发工具类之CountDownLatch
摘要:CountDownLatch是多线程同步工具,允许主线程等待其他线程完成操作。相比join()方法,它更灵活,通过计数器控制等待线程数量,支持超时机制,适用于多任务并行处理场景(如Excel多sheet解析)。其核心机制是通过countDown()递减计数,await()阻塞直至计数归零,且计数不可重置。典型应用包括主线程等待多个子线程完成,或等待单个线程的多个步骤完成。
2026-01-07 12:21:30
271
原创 Java中的13个原子操作类
Java并发包中的原子操作类提供了线程安全的变量更新方式。主要包括四类:原子更新基本类型(如AtomicInteger)、原子更新数组(如AtomicIntegerArray)、原子更新引用类型(如AtomicReference)和原子更新字段(如AtomicIntegerFieldUpdater)。这些类通过CAS机制实现无锁线程安全,提供getAndIncrement、compareAndSet等方法,适用于多线程环境下的变量操作。其中AtomicIntegerFieldUpdater需要配合volat
2026-01-07 12:16:04
761
原创 Java中的读写锁
读写锁通过分离读锁和写锁提升并发性能,适用于读多写少的场景。Java的ReentrantReadWriteLock采用一个32位状态变量,高16位记录读锁次数,低16位记录写锁次数。写锁是排他锁,获取时需要确保没有读锁存在;读锁是共享锁,允许多线程同时获取。锁降级机制允许线程在持有写锁时获取读锁再释放写锁,确保数据可见性,但不支持锁升级以避免数据不一致。这种设计在保证线程安全的同时显著提高了并发效率。
2026-01-05 17:52:01
763
原创 Jav重入锁ReentrantLock介绍
摘要:ReentrantLock是支持重入和公平性选择的锁机制。重入特性通过识别当前持有线程和计数器实现,允许线程多次获取同一锁。锁释放时计数器递减,归零时完全释放。公平锁通过FIFO顺序获取,而非公平锁可能产生更高吞吐量但存在"饥饿"风险。实现上,公平锁额外检查同步队列中的前驱节点,而非公平锁直接尝试CAS获取。两种方式在并发控制中各有适用场景。
2026-01-05 16:44:34
381
原创 Java队列同步器的实现分析
本文分析了同步器实现线程同步的核心机制。主要包括:1)同步队列采用FIFO双向队列管理线程节点,通过CAS保证线程安全入队;2)独占式同步通过acquire()方法实现状态获取、节点构造和自旋等待;3)共享式同步允许多线程同时获取状态,通过tryAcquireShared()判断;4)超时获取机制在响应中断基础上增加时限控制,通过计算剩余睡眠时间实现。同步器通过队列管理、状态获取/释放和超时控制等机制,为Java并发组件提供了灵活的同步基础。
2026-01-04 12:07:36
793
原创 Java同步器的介绍
本文介绍了基于AQS(AbstractQueuedSynchronizer)实现自定义同步组件的方法。AQS采用模板方法模式,使用者需继承AQS并重写指定方法(如tryAcquire和tryRelease),通过getState、setState和compareAndSetState三个方法来操作同步状态。文章以独占锁Mutex为例,展示了如何定义一个继承AQS的静态内部类Sync,实现独占式获取和释放同步状态。Mutex通过调用AQS的模板方法(如acquire)来简化同步组件的实现,隐藏了底层同步队列管
2026-01-04 12:02:59
291
原创 Java中的锁
Java并发编程中,Lock接口提供了比synchronized更灵活的锁机制,支持显式获取/释放锁、可中断获取和超时控制等特性。Lock实现通常通过聚合AbstractQueuedSynchronizer(AQS)子类完成线程控制。AQS是构建锁和其他同步组件的基础框架,使用int变量表示同步状态和FIFO队列管理线程排队。子类继承AQS并通过其提供的安全状态操作方法来实现自定义同步组件,如ReentrantLock。锁面向使用者,隐藏实现细节;AQS面向实现者,简化了状态管理、线程排队等底层操作,二者很
2026-01-04 12:00:05
381
原创 Java中的hashCode()和equals()
摘要:本文探讨了Java中hashCode()和equals()方法的关系与区别。hashCode()用于生成对象哈希值,在散列存储中定位对象,要求equals相同的对象hashCode必须相同。equals()用于比较对象内容,而==比较内存地址。重写equals()时必须同时重写hashCode()以确保一致性。文中通过String类实例说明==比较地址而equals比较内容的差异。
2026-01-02 11:02:29
117
原创 Java中HashMap的实现原理
HashMap是基于哈希表的Map实现,采用数组+链表结构存储键值对。它允许null键/值,但不保证顺序。存储时通过hash算法确定数组位置,若发生哈希冲突则以链表形式存储;读取时同样先计算hash定位,再通过equals匹配键值。当元素数量超过阈值(容量*负载因子)时会自动扩容,重新计算所有元素位置。HashMap通过这种结构有效处理哈希冲突,结合哈希快速定位和链表解决冲突的特点,提供了高效的存取性能。合理预设初始容量可避免频繁扩容带来的性能损耗。
2026-01-02 10:56:36
767
原创 关于软考高级资质的经验分享
本文分享了软考高级资质考试的备考经验,涵盖综合知识、案例分析和论文写作三部分。综合知识部分建议通过大纲梳理、真题练习和错题总结来提升;案例分析强调真题训练和重点章节突破;论文写作则需注重逻辑结构,提前准备背景和过渡段落,核心段要结合实际案例。作者提醒考生不必追求完美,45分即可通过,并建议合理分配考试时间。最后鼓励考生坚定信心,认真备考,预祝2026年考试顺利。
2026-01-02 10:42:43
253
原创 Java ThreadLocal介绍
ThreadLocal是Java提供的线程本地存储工具,为每个线程创建独立的变量副本,实现线程间数据隔离。其核心原理是通过Thread内部的ThreadLocalMap存储数据,以ThreadLocal实例为key存取线程特有值。典型应用包括数据库连接管理、用户上下文传递和日期格式化工具。使用需注意内存泄漏风险(建议用完调用remove())、线程池复用问题,且不能替代同步机制。示例展示了ThreadLocal在方法耗时统计中的实际应用,通过begin()和end()方法实现跨方法调用时间差计算。
2025-12-28 20:07:54
287
原创 Java线程的启动及操作
本文介绍了Java线程的构造、启动、中断及安全终止方法。在构造线程时,子线程会继承父线程的Daemon状态、优先级等属性,并获得唯一ID。启动线程需调用start()方法,建议设置线程名称以便排查问题。中断操作通过interrupt()实现,但抛出InterruptedException的线程会清除中断标识位。不建议使用suspend()、resume()和stop()方法,因其可能导致资源未释放或死锁。安全终止线程推荐两种方式:通过中断标识位或boolean变量控制,使线程能优雅释放资源。文中通过代码示例
2025-12-28 14:41:14
756
原创 Java线程简介
本文介绍了Java线程的基本概念和使用要点。首先解释了线程是操作系统调度的最小单元,Java程序天生是多线程程序,并通过代码示例展示了程序运行时包含的多个系统线程。其次讨论了线程优先级机制,指出优先级设置在不同系统上可能失效,程序正确性不能依赖优先级。最后讲解了Daemon线程的特性,强调其用于后台支持工作,且在JVM退出时finally块不一定执行,因此不能在finally块中放置关键资源清理逻辑。文章通过具体代码示例演示了这些线程特性的实际表现。
2025-12-28 14:31:04
850
原创 Java中的双重检查锁定与延迟初始化介绍
摘要:本文分析了Java中双重检查锁定(Double-Checked Locking)模式的错误根源。该模式原本旨在降低同步开销,但由于对象初始化过程中可能出现指令重排序(2和3步骤交换),导致其他线程可能访问到未完全初始化的对象。文章提出了两种解决方案:1) 使用volatile修饰实例变量,禁止指令重排序;2) 采用基于类初始化的方案(Initialization On Demand Holder模式),利用JVM类初始化时的同步机制保证线程安全。这两种方法都能正确实现线程安全的延迟初始化。
2025-12-27 20:34:36
558
原创 Java并发编程中的final域介绍
摘要:本文探讨了final域的内存语义及其重排序规则。对于final域,编译器需遵守两条规则:1)构造函数内final域的写入不能与对象引用赋值重排序;2)初次读对象引用与读final域不能重排序。final域能确保对象引用可见时其值已被正确初始化,而普通变量不具备此保障。对于引用类型的final域,还增加了对引用对象成员域写入的限制。此外,需防止构造函数内对象引用"逸出",否则可能导致final域未被初始化就被其他线程访问。final域通过插入内存屏障实现这些语义保障。
2025-12-27 20:19:34
600
原创 Java中volatile的介绍
摘要:volatile关键字保证变量的可见性和原子性,单个读/写操作相当于同步锁操作,但不保证复合操作的原子性。volatile写操作会刷新本地内存到主内存,读操作会使本地内存失效并从主内存重新读取。通过happens-before规则,volatile建立了线程间的内存可见性,写操作相当于发送消息,读操作相当于接收消息,实现线程间通信。
2025-12-25 09:00:19
1019
原创 Java内存模型JMM详解
并发编程需要解决线程通信和同步两大问题。通信机制分为共享内存(隐式通信,显式同步)和消息传递(显式通信,隐式同步)。Java内存模型(JMM)通过主内存和线程本地内存的抽象关系控制线程间通信,确保内存可见性。程序执行时存在编译器优化、指令并行和内存系统三种重排序,JMM通过内存屏障指令限制这些重排序。happens-before规则定义了操作间的可见性顺序,而as-if-serial语义保证单线程程序的执行结果不受重排序影响。在多线程环境中,重排序可能破坏程序语义,数据竞争会导致未同步程序出现内存一致性问题
2025-12-25 08:39:54
699
原创 Java原子操作的实现原理
原子操作是不可中断的单个或系列操作,处理器通过总线锁和缓存锁保证其原子性。总线锁通过LOCK#信号独占内存访问,而缓存锁利用处理器内部缓存和一致性机制实现更高效的操作。Java通过锁和循环CAS(Compare-And-Swap)实现原子操作,CAS利用处理器指令实现无锁线程安全,但存在ABA问题、循环开销大和单变量限制等问题。ABA问题可通过版本号解决,多变量操作可合并或使用AtomicReference类。锁机制(如偏向锁、轻量级锁)也依赖CAS实现同步块的进出操作。
2025-12-24 11:53:16
479
原创 Java并发机制的底层实现原理
摘要:本文分析了Java多线程中的synchronized和volatile机制。synchronized通过对象头实现锁,包含普通方法、静态方法和同步代码块三种形式,Java 1.6对其进行了优化,引入偏向锁和轻量级锁的升级机制。volatile通过缓存一致性协议保证变量可见性,比synchronized更轻量。锁状态从低到高依次为无锁、偏向锁、轻量级锁和重量级锁,可升级但不可降级,以平衡性能与并发安全。两种机制在多线程编程中各具优势,需根据具体场景选择使用。
2025-12-24 11:48:56
488
原创 Java并发编程学习笔记-第一章
本文分析了Java多线程中的竞态条件和活跃性问题。竞态条件示例展示了当多个线程同时执行value++操作时,由于操作的非原子性可能导致结果不一致,解决方案是使用synchronized同步方法。活跃性问题包括死锁、饥饿和活锁,它们会导致程序无法继续执行。文章指出安全性与活跃性之间存在制衡关系,过度使用锁可能导致死锁,而Java应用程序无法从死锁中恢复,因此设计时需要避免可能导致死锁的条件。最后强调线程在Java中的普遍存在性,从JVM启动时就开始使用。
2025-12-23 11:36:53
276
原创 Java中的线程池简介及实战
线程池是一种预先创建并管理线程的多线程处理机制,可避免频繁创建销毁线程的开销。相比直接创建线程,线程池能降低资源消耗、提高管理效率并防止系统崩溃。Java线程池核心包括ExecutorService接口、ThreadPoolExecutor实现类和Executors工厂类,后者提供固定大小、缓存等常见线程池。案例展示了如何使用固定线程池和单线程定时任务池,但建议避免直接使用Executors,而应通过ThreadPoolExecutor进行显式配置。线程池能有效提升多线程程序的性能和稳定性。
2025-12-23 08:32:21
199
原创 Java线程的两个重要方法
摘要:本文介绍了Java线程的两个重要方法。守护线程通过setDaemon(true)设置,当主线程退出时守护线程会自动终止。join()方法使调用线程(如main)等待被调用线程(如bobi)执行完毕后再继续执行,实现线程同步。示例代码展示了守护线程的创建和join方法的使用效果,演示了线程执行的顺序控制。
2025-12-22 18:15:52
101
原创 Java线程终止
摘要:Java中线程终止的两种方法:1)标志位法,通过设置boolean变量控制循环;2)中断法,利用interrupt()触发InterruptedException。标志位法直接修改成员变量,中断法需捕获异常后处理。示例代码展示了两种实现方式,其中标志位法简单直接,中断法则适用于线程处于wait状态时强制唤醒处理。两种方法都能有效终止线程执行,但中断法需要额外异常处理。
2025-12-22 18:13:38
175
原创 Java多线程实现生产者和消费者
本文展示了Java多线程通信的三种实现方式:1)使用synchronized、wait和notify实现生产者-消费者模型;2)优化后的多线程版本使用notifyAll避免死锁;3)采用JDK1.5的Lock和Condition接口实现更精细的线程控制。通过煤炭运输案例,演示了生产者(卡车)和消费者(锅炉)如何安全共享资源,包括线程同步、等待唤醒机制以及锁的使用。随着线程数量增加,文章逐步改进方案,最终使用ReentrantLock和Condition实现定向唤醒,解决了多线程环境下的资源竞争问题。
2025-12-22 18:08:50
184
原创 Java多线程实战使用锁机制完成线程同步
摘要:本文展示了三种多线程售票的实现方式。解法1未加同步锁,会出现漏卖和重复售票问题;解法2通过synchronized(this)实现了线程同步,解决了并发问题;解法3使用静态变量和Ticket.class作为锁对象,确保票号有序。所有方案都通过两个线程(Bob和Mick)模拟售票过程,主线程在子线程结束后终止。同步机制的选择取决于具体场景,静态方法需使用类对象作为锁,而非静态方法可使用this。
2025-12-22 18:03:23
149
原创 awk命令学习总结
摘要: awk是一种强大的文本分析工具,适用于Linux/Unix环境,支持数据排序、处理和报表生成。它以行为单位处理文本,默认以空格分隔字段,支持正则表达式、变量和函数。awk脚本由可选的BEGIN、模式匹配和END三部分组成,支持命令行和脚本两种使用方式。常用选项包括-F(指定分隔符)、-v(传递变量)和-f(加载脚本)。内置变量如NR(行号)、NF(字段数)等便于数据处理。示例展示了行计数、字段提取和外部变量传递等操作,体现其灵活性和功能性。
2025-12-22 13:07:36
434
原创 Sed命令学习总结
本文详细介绍了sed命令的使用方法,主要包括四部分内容:1)常用命令如插入、删除、替换等;2)替换标记的使用;3)正则表达式元字符集;4)实用操作示例,包括文本替换、范围处理、文件读写等。重点讲解了sed的各种参数组合和典型应用场景,如-i直接修改文件、-n静默模式、-e多命令执行等。通过大量实例展示了如何利用sed进行高效文本处理,包括行操作、模式匹配、缓冲区使用等技巧,为Linux环境下文本处理提供了全面的参考指南。
2025-12-22 13:04:26
473
原创 Java消息服务(Java Message Service)介绍及实战
JMS是Java平台中面向消息中间件的API,支持异步通信。它包含生产者、消费者、消息队列等核心组件,支持点对点和发布/订阅两种消息模型。JMS提供连接工厂、会话等对象类型,实现跨平台消息传递。示例代码展示了使用ActiveMQ实现的生产者-消费者模式,生产者发送消息到指定队列,消费者从队列接收消息。JMS通过标准化的API屏蔽底层差异,类似JDBC访问不同数据库,为分布式系统提供灵活可靠的消息通信机制。
2025-12-21 20:31:49
930
原创 JVM中堆空间的回收策略
JVM垃圾回收机制主要分为MinorGC(新生代)和MajorGC(老年代)。新生代采用复制算法,老年代使用标记清除或标记整理算法。垃圾回收器包括Serial、ParNew、ParallelScavenge、CMS和G1等,各自针对不同场景优化。G1作为新一代收集器,通过分Region管理和优先级回收实现高效回收。回收策略选择需权衡吞吐量、停顿时间和CPU资源消耗等因素。
2025-12-21 12:59:25
576
原创 JVM运行时数据区详细介绍
摘要:JVM运行时数据区包括虚拟机栈、本地方法栈、方法区、程序计数器和堆。虚拟机栈存储方法调用栈帧,线程私有;本地方法栈支持Native方法;方法区存放类信息、常量池等;程序计数器记录线程执行位置;堆是最大内存区域,分为新生代、老年代和永久代(Java8元空间),存储对象实例。堆内存通过垃圾回收机制管理,其中新生代采用分代回收策略,老年代存放长期存活对象。各区域功能明确,共同支撑Java程序运行。
2025-12-21 10:30:17
503
注册人工智能工程师基础级考试大纲解析及学习笔记
2026-01-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅