编程语言
文章平均质量分 84
编程语言
SpringHeather
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java基础系列(十九) Spring Boot自动装配,启动流程,配置优先级
SpringBoot自动装配核心原理是通过@EnableAutoConfiguration注解驱动,结合SpringFactoriesLoader扫描META-INF/spring.factories文件中的自动配置类,并利用条件注解(@Conditional)筛选生效配置。启动流程分为初始化SpringApplication和执行run()方法两个阶段,包括环境准备、上下文创建与刷新、Web服务器启动等关键步骤。Web项目通过ServletWebServerFactoryAutoConfiguration原创 2025-12-22 18:21:03 · 1358 阅读 · 0 评论 -
Java基础系列(十八) 集合类
本文系统梳理了Java集合框架的核心知识点。Collection分为List(有序可重复)、Set(无序唯一)和Queue(队列结构);Map存储键值对。详细分析了ArrayList、LinkedList、HashSet、TreeSet等实现类的底层结构和特点,特别对HashMap的哈希计算、冲突处理、扩容机制等关键过程进行深入解析。同时比较了HashMap在多线程环境下的线程安全问题与ConcurrentHashMap的解决方案,包括Java7的分段锁和Java8的CAS+synchronized优化。最原创 2025-12-22 17:14:05 · 740 阅读 · 0 评论 -
Java基础系列(十七) Kafka、RocketMQ 和 RabbitMQ
消息队列架构对比摘要 Kafka、RocketMQ和RabbitMQ是三种主流消息队列系统,它们在架构设计上各有特点: Kafka采用生产者-消费者-Broker-ZooKeeper架构,通过分区(Partition)和副本机制保证高可用性,仅保证分区内消息顺序,消费者通过消费组实现扩展。 RocketMQ架构类似但使用NameServer替代ZooKeeper,消息可按Topic和Tag分类,采用主从复制保证高可用,支持生产者组和事务消息。 RabbitMQ基于Exchange-Queue模型,提供四种E原创 2025-12-22 12:31:40 · 269 阅读 · 0 评论 -
Java基础系列(十六) MQ 设计,消息幂等性,顺序性,不丢失
摘要:本文深入探讨了消息队列(MQ)的核心设计原理与关键问题解决方案。首先分析了同步RPC调用的弊端,提出异步消息机制实现服务解耦,并详细介绍了消息队列的两种基本模式(队列模式和发布订阅模式)。其次,阐述了Broker集群、分区机制和注册中心的高可用设计,构建完整的消息工作流程。最后重点讨论了消息幂等性和顺序性保障方案,包括唯一ID+Redis去重、数据库唯一约束等通用方案,以及生产者-消费者全链路防丢失策略。全文系统性地梳理了分布式消息系统的核心架构与最佳实践。原创 2025-12-22 10:28:38 · 780 阅读 · 0 评论 -
Java基础系列(十五) 缓存与数据库一致性
本文总结了缓存更新的常见策略与一致性保障方案。主要介绍了三种缓存模式:CacheAside(业务层控制读写)、ReadThrough/WriteThrough(缓存组件自动同步)、WriteBack(异步写库)。重点分析了CacheAside模式下的数据一致性问题,指出并发场景下单纯"先更库后更缓存"或相反顺序都无法保证一致性。提出了删除缓存优于更新缓存的实践原则,并推荐"更新数据库+删除缓存"的主流方案。针对删除失败问题,给出重试机制、异步任务和TTL过期三重保障。原创 2025-12-21 21:48:45 · 284 阅读 · 0 评论 -
Java基础系列(十四) Redis持久化和高可用
Redis提供了RDB和AOF两种持久化机制:RDB通过快照保存全量数据,恢复快但可能丢失数据;AOF记录写命令,数据更安全但恢复慢。混合持久化结合了两者优势。在高可用方面,主从复制配合哨兵实现故障转移,而Redis集群通过数据分片和内置故障转移机制同时解决扩展性和高可用问题。主从+哨兵适合单机内存足够场景,集群则适用于需要水平扩展的大规模应用。原创 2025-12-21 18:54:57 · 847 阅读 · 0 评论 -
Java基础系列(十三) Redis应用场景,缓存击穿 / 穿透 / 雪崩
Redis数据结构与应用场景全解析 Redis提供多种数据结构,各具特色: String:缓存对象、分布式锁、计数器 Hash:对象存储、购物车、多维度统计 List:消息队列、实时消息流 Set:抽奖系统、去重、共同好友 ZSet:排行榜、滑动窗口限流 Stream:专业消息队列 缓存三大问题解决方案: 缓存击穿:互斥锁/逻辑过期/本地缓存 缓存穿透:参数校验/空值缓存/布隆过滤器 缓存雪崩:随机TTL/永不过期/缓存预热 Redis不仅可作缓存,合理使用其数据结构可实现分布式锁、消息队列、社交Feed等原创 2025-12-21 18:27:46 · 469 阅读 · 0 评论 -
Java基础系列(十二) 索引,SQL执行,事务,MVCC
本文系统介绍了数据库索引与事务的核心知识。索引部分详解了B+树作为主流索引结构的原因,分析了不同数据结构的适用场景,阐述了聚簇索引与二级索引的区别,并总结了索引设计的最佳实践。事务部分深入讲解了ACID特性及其实现机制,包括MVCC、ReadView等关键技术,对比了不同隔离级别对并发问题的处理能力,特别强调了可重复读隔离级别如何通过MVCC和锁机制避免幻读。全文从理论到实践,全面剖析了数据库索引与事务的工作原理,为数据库性能优化提供了系统性的指导。原创 2025-12-21 14:42:04 · 562 阅读 · 0 评论 -
Java基础系列(十一) MySQL日志
本文系统介绍了MySQL中的三大日志机制:UndoLog(回滚日志)记录数据修改前的旧版本,用于事务回滚和MVCC实现;RedoLog(重做日志)记录数据页的物理修改,通过顺序I/O保证事务持久性和崩溃恢复;Binlog(二进制日志)记录逻辑SQL操作,用于主从复制和数据备份。重点分析了RedoLog的刷盘机制、BufferPool的缓存作用,以及通过两阶段提交协议确保RedoLog和Binlog的一致性。这些日志机制各司其职,共同保障了MySQL的事务特性(ACID)、性能优化和数据可靠性。原创 2025-12-21 12:03:14 · 380 阅读 · 0 评论 -
Java基础系列(十) JVM和垃圾回收
JVM架构核心解析:内存管理与垃圾回收 JVM由类加载系统、运行时数据区、执行引擎等五大组件构成。运行时数据区包括线程共享的堆(存储对象)和方法区(类元数据),以及线程私有的JVM栈、程序计数器和本地方法栈。对象通常存储在堆中,而基本类型存储在栈上。JVM采用可达性分析算法判断垃圾对象,通过分代收集策略(年轻代用复制算法,老年代用标记-清除/整理)进行垃圾回收。CMS和G1是两种主流垃圾收集器,其中G1采用Region化内存管理,具有更好的停顿控制能力。JVM通过这种分层设计实现了高效的内存管理和自动垃圾回原创 2025-12-20 19:59:10 · 853 阅读 · 0 评论 -
Java基础系列(九) 双亲委派
Java类加载器主要分为四类:启动类加载器(Bootstrap)、扩展类加载器(Extension/Platform)、应用类加载器(Application)和自定义类加载器(Custom)。双亲委派模型是类加载的默认机制,确保核心类库的安全性和一致性,但并非强制约束。SPI机制、Web容器等场景会打破该模型,通过线程上下文类加载器实现反向委派。这种灵活设计既保证了安全性,又支持了系统的扩展性和动态加载能力。原创 2025-12-20 19:33:07 · 443 阅读 · 0 评论 -
Java基础系列(八) JMM
Java内存模型(JMM)技术问答摘要: JMM规范定义了线程与主内存的交互规则,解决多线程环境下的可见性、有序性和原子性问题。核心机制包括:工作内存与主存间的八种交互操作(lock/unlock/read/load/use/assign/store/write)、内存屏障(LoadLoad/StoreStore/LoadStore/StoreLoad)和happens-before规则。JMM通过synchronized、volatile、CAS等工具保证:1)可见性-确保线程修改可见;2)有序性-防止指原创 2025-12-20 13:22:53 · 276 阅读 · 0 评论 -
Java基础系列(七) 线程池
Java线程创建和销毁开销大是因为其与内核线程一一对应,需系统调用分配资源。创建线程必须通过Thread.start(),而Runnable等只是任务提交方式。线程池通过复用线程降低开销,其核心流程包括使用核心线程、队列缓冲和拒绝策略。为避免任务被拒,可采用无界队列、持久化或CallerRunsPolicy策略。动态线程池可通过配置中心实现参数热更新。监控线程池需关注活跃线程数、队列大小等指标。线程池核心参数包括核心线程数、队列类型和拒绝策略等,ThreadFactory则用于线程命名和创建控制。原创 2025-12-20 13:03:01 · 292 阅读 · 0 评论 -
Java基础系列(六) ThreadLocal
摘要: ThreadLocal通过线程内部的ThreadLocalMap存储数据,key为ThreadLocal实例(弱引用),value为强引用。弱引用key可避免ThreadLocal对象内存泄漏,但需手动remove()清理无效Entry防止value泄漏。ThreadLocalMap采用线性探测解决哈希冲突,触发get/set时清理失效Entry。与锁不同,ThreadLocal通过数据副本隔离实现无锁线程安全。静态ThreadLocal变量因存储在线程私有Map中,仍能保证线程间数据独立。正确使用原创 2025-12-20 11:57:37 · 637 阅读 · 0 评论 -
Java基础系列(四) AQS 与并发工具类设计
摘要:AQS(AbstractQueuedSynchronizer)是Java并发工具类的核心框架,通过int型state变量(volatile+CAS)实现资源状态管理。其设计特点包括:1)支持独占/共享模式,满足不同并发场景;2)使用双向链表实现高效线程等待队列;3)提供tryAcquire/acquire等灵活API;4)相比synchronized更轻量且功能更丰富。典型实现如ReentrantLock(支持公平/非公平锁)、Semaphore(许可证控制)和CountDownLatch(任务计数器原创 2025-12-20 10:56:03 · 602 阅读 · 0 评论 -
Java基础系列(二) CAS
摘要:悲观锁通过获取锁保证线程安全,但性能较低;乐观锁采用CAS机制实现无锁并发,通过硬件指令保证原子性。Java的Atomic类使用CAS和volatile实现原子操作,数据库乐观锁通过版本号或条件更新实现。CAS存在ABA问题和自旋开销,可通过版本号或混合锁策略解决。虽然硬件层面存在锁定操作,但从开发者角度CAS仍被视为高效的无锁方案。原创 2025-12-20 01:18:30 · 161 阅读 · 0 评论 -
Java基础系列(三) Synchronized锁
摘要:锁机制解决并发编程中的可见性、有序性和原子性问题。Java的synchronized通过monitorenter/monitorexit字节码指令实现,保证互斥性、可见性和有序性。Java6引入锁升级机制(无锁→偏向锁→轻量级锁→重量级锁)优化性能,针对不同竞争场景采用不同策略:偏向锁优化单线程访问,轻量级锁使用CAS自旋减少切换开销,重量级锁处理高竞争场景。Monitor机制管理锁状态,包含Owner线程、重入计数、EntryList(阻塞线程)和WaitSet(等待线程)等组件,分别处理锁竞争和线原创 2025-12-20 00:00:57 · 321 阅读 · 0 评论 -
Java基础系列(五) 分布式锁
Redis分布式锁实现要点:1.使用SETNX+EX命令保证互斥性,设置过期时间防止死锁;2.释放锁时需校验持有者,避免误删;3.通过看门狗机制续期,防止业务未完成锁过期;4.支持可重入性,使用哈希表记录线程ID和重入次数;5.主从架构存在锁丢失风险,Redisson采用多主节点锁定解决;6.RedLock算法存在争议,实际生产中多采用简单分布式锁或Redisson框架。关键要保证互斥性、防死锁和可重入性。原创 2025-12-19 22:32:19 · 361 阅读 · 0 评论 -
Java基础系列(一) Synchronized,ReentrantLock
摘要:Java的synchronized是内置线程安全机制,通过对象锁实现原子性、可见性和有序性。JDK1.6引入锁升级(无锁→偏向锁→轻量级锁→重量级锁)、锁消除和锁粗化优化,显著提升性能。其可重入特性通过计数器实现,与ReentrantLock的AQS机制类似。分布式锁(如Redis)通过哈希存储重入次数实现可重入。尽管虚拟线程(JDK21)采用N:M模型降低切换开销,但synchronized仍是核心同步机制。现代JVM中,优化后的synchronized在多数场景性能接近显式锁。原创 2025-12-19 22:26:32 · 281 阅读 · 0 评论 -
Golang与Java全方位对比总结
本文对比了Golang与Java在基础语法、结构体函数、异常处理、并发编程及垃圾回收等方面的差异。Golang具有严格的编码规范,变量必须使用,可见性通过首字母大小写控制,支持逗号ok模式和多返回值。结构体代替类,支持组合而非继承,函数与方法分离。Java则基于类构建,具有清晰的层次接口。在参数传递方面,Golang的slice表现类似引用类型,而固定长度数组为值传递;Java数组均为引用传递。对象处理上,Golang是值拷贝,Java是引用传递。两种语言在类型系统、作用域控制和程序设计理念上存在显著差异。转载 2023-05-03 17:47:42 · 1435 阅读 · 1 评论 -
流行编程语言的详细对比(10)--线程同步
Java七种方法1.同步方法即有synchronized关键字修饰的方法。由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。代码如:public synchronized void save(){}注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类2.同步代码块即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现原创 2020-05-19 16:57:37 · 211 阅读 · 0 评论 -
流行编程语言的详细对比(9)--线程建立
Java继承Thread1)定义Thread的子类,实现run()方法2)创建Thread子类的对象 [创建之后,线程处于新建状态]3)调用线程对象的start方法 [线程处于就绪状态]实现runnable或者callable1)定义类,实现runnable接口,重写run方法2)创建上述类类的对象 [创建之后,线程处于新建状态]3)不直接调用上述对象的start方法,而是将其作为target。new Thread(对象).start() [线程处于就绪状态]Js前端:j原创 2020-05-19 16:33:05 · 433 阅读 · 0 评论 -
流行编程语言的详细对比(8)--容器类
容器类Java接口 list set map介绍与简单对比List:关心的是顺序,它保证维护元素特定的顺序(允许有相同元素),使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素。即可以通过下标 (1,2…) 来取得值,值可以重复。Set:仅接受一次,并做内部排序。只关心某元素是否属于 Set (不允许有相同元素),而不关心它的顺序。只能通过游标来取值,并且值是不能重复的。Map:最大的特点是键值映射原创 2020-05-19 16:31:17 · 184 阅读 · 0 评论 -
流行编程语言的详细对比(7)--对象继承
对象继承Javapublic class Animal { private String name; private int id; public Animal(String myName, String myid) { //初始化属性值 } public void eat() { //吃东西方法的具体实现 } public void sleep() { //睡觉方法的具体实现 } } public class原创 2020-05-19 16:28:18 · 156 阅读 · 0 评论 -
流行编程语言的详细对比(6)--对象建立和析构函数
对象建立Java(1)使用new关键字,调用了构造函数Employee emp1 = new Employee();(2)使用Class类的newInstance方法,调用了构造函数Employee emp2 = (Employee) Class.forName("org.programming.mitra.exercises.Employee").newInstance();或者Employee emp2 = Employee.class.newInstance();(3)使用Cons原创 2020-05-19 16:24:50 · 156 阅读 · 0 评论 -
流行编程语言的详细对比(5)--异常处理
异常处理Javatry{ System.out.println("Access element three :" + a[3]);}catch(ArrayIndexOutOfBoundsException e){ System.out.println("Exception thrown :" + e);}finally{ a[0] = 6; System.out.println("First element value: " +a[0])原创 2020-05-19 16:19:59 · 186 阅读 · 0 评论 -
流行编程语言的详细对比(4)--常量和条件控制
常量Javafinal修饰符标识终态的,用它修饰的字段标识“常量”希望某个常量可以在一个或多个类中的多个方法中使用,这类常量通常叫做“类常量”。使用关键字static final修饰。JsJavascript中没有常量,可以通过创建只能取值,不能赋值的私有变量来模仿常量.Python可以import const 通过外部包实现Goconst variable type = value;const LENGTH int = 10const WIDTH int = 5Scalav原创 2020-05-19 16:16:06 · 159 阅读 · 0 评论 -
流行编程语言的详细对比(3)--基本数据类型和字符串处理
基本数据类型Java1.boolean 布尔型 1 字节2.byte 字节类型 1字节3.char 字符型 2 字节 一个字符能存储一个中文汉字4.short 短整型 2字节5.int 整数类型 4字节6.float 浮点类型(单精度) 4字节7.long 长整形 8字节8.double 双精度原创 2020-05-19 16:13:07 · 423 阅读 · 0 评论 -
流行编程语言的详细对比(2)--包管理
包管理Java定义包:包语句的语法格式为:package pkg1[.pkg2[.pkg3…]];引用:import package1[.package2…].(classname|*);Js定义包:<script> (function(){ //自己的命名空间,外部无法访问。 //定义了自己的函数$() Function原创 2020-05-19 16:03:54 · 255 阅读 · 0 评论 -
流行编程语言的详细对比(1)--Hello World和注释
将要讨论的编程语言是跨平台的,这样的应用范围更广,语言包括Java,JavaScript,Python,Go,Scala,PHP.至于C/C++呢,属于元老级别,偏底层,暂不讨论。比较是有意义的,为什么这么说?当使用不同语言,不熟悉时候,像查新华字典一样,快速得出新语言的写法。另外在访问Github的时候,看到实用的代码,但是与项目现有开发语言不同,这时候按照语言的比较也能很快改写。通过比较,我们希望看到编程语言相同的一面,可能那就是编程的秘笈(_)下面开始语言之旅,请系好安全带,呵呵。一 首先从h原创 2020-05-19 16:01:20 · 222 阅读 · 0 评论 -
Window平台使用VS2010简单快速搭建QT开发环境
QT是个开源免费跨平台的图形界面开发软件,在Windows平台用它来写写一些小小的工具软件(比如串口调试软件、报文分析软件)还是不错的。 在Windows平台,如果使用VS软件来作为QT的开发环境,它的环境配置还是很简单的。 以当前最新的QT4.8.2为例,用户只需下载QT的Windows库:qt-win-opensource-4.8.2-vs2010.exe和VS20转载 2013-04-14 15:18:23 · 482 阅读 · 0 评论 -
Qt 智能指针学习
从内存泄露开始?很简单的入门程序,应该比较熟悉吧 ^_^#include #include int main(int argc, char *argv[]){ QApplication app(argc, argv); QLabel *label = new QLabel("Hello Dbzhang800!"); label->show(); re转载 2013-04-14 19:27:26 · 470 阅读 · 0 评论 -
Google C++编程风格指南(参考)
背景Google的开源项目大多使用C++开发。每一个C++程序员也都知道,C++具有很多强大的语言特性,但这种强大不可避免的导致它的复杂,这种复杂会使得代码更易于出现bug、难于阅读和维护。本指南的目的是通过详细阐述在C++编码时要怎样写、不要怎样写来规避其复杂性。这些规则可在允许代码有效使用C++语言特性的同时使其易于管理。风格,也被视为可读性,主要指称管理C++代码的习转载 2013-04-14 14:56:42 · 679 阅读 · 0 评论 -
VS2010环境下Boost 1.49.0配置笔记
Boost 实际上是由几十个不同功能的函数库组成的 C++ 函数库集合(Set of libraries),它最初是由 C++Standard Committee 的部分委员发起并开发,含有众多能够极大拓展 C++ 语言功能和易用性的函数。它的风格与标准模板库相似,跨平台并且通用性很强,并且其很多组成库已经被收录在 C++11 新标准中,可以被看作C++标准库的官方扩展版。以下是个人总结的转载 2013-04-14 15:11:48 · 668 阅读 · 0 评论 -
VS2012编译boost1.53
VS2012编译boost1.53一、下载Boost库boost_1_53_0.zip (http://www.boost.org/users/download/),解压到D:\boost要做Python开发的还需下载: python-2.7.3.msi (http://www.python.org/)二、编译Boost库1. 编译jam转载 2013-04-14 15:03:12 · 541 阅读 · 0 评论
分享