自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 CAS&多线程环境使用哈希表

本文聚焦 CAS 机制与多线程哈希表核心使用要点。CAS(Compare and swap)通过比较内存值与预期值并匹配更新的原子操作保障线程安全,应用于 JUC 的 atomic 类,其 ABA 问题可通过版本号解决。哈希表方面,HashMap 无锁、线程不安全但支持 null 值;HashTable 以全表锁实现线程安全,效率低且已淘汰,不支持 null 值;ConcurrentHashMap 优化锁机制(锁桶 + CAS)与扩容方式,线程安全高效,不支持 null 值,是多线程场景首选。

2025-12-22 08:00:00 705

原创 Java多线程案例--初识线程池

本文介绍了线程池的概念及其在Java标准库中的实现方式。线程池通过复用线程解决频繁创建销毁线程导致的效率问题。标准库提供ExecutorService接口和Executors工厂类来创建四种线程池:固定大小、动态增长、单线程和定时任务线程池。ThreadPoolExecutor则允许更细致的参数定制,包括核心线程数、最大线程数、空闲时间和拒绝策略等。文章还通过模拟实现一个固定大小的线程池,展示了线程池的基本工作原理,使用阻塞队列管理任务并复用线程执行。

2025-12-13 08:00:00 693

原创 Java多线程案例--定时器

Java定时器实现原理与模拟 摘要:本文介绍了Java标准库中的Timer定时器实现原理,并通过代码示例演示了如何模拟实现一个简单的定时器。Timer类通过schedule方法添加任务,使用TimerTask封装要执行的任务内容和延迟时间。关键实现包括:1)使用优先级队列管理任务,按执行时间排序;2)通过线程轮询检查任务执行时间;3)采用wait/notify机制优化等待过程。文章详细讲解了任务调度、线程安全处理等核心问题,并提供了完整的模拟实现代码,包括任务比较、队列操作和时间判断等关键逻辑。

2025-12-04 02:08:17 917

原创 Java多线程案例--阻塞式队列

本文介绍了阻塞队列的概念及其在生产者消费者模型中的应用。阻塞队列是一种线程安全的队列,具有当队列满时入队阻塞、队列空时出队阻塞的特性。文章通过Java标准库中的ArrayBlockingQueue和LinkedBlockingQueue实现示例,展示了生产快消费慢的场景。最后详细讲解了如何基于普通队列实现阻塞队列,包括使用synchronized保证线程安全,以及通过wait/notify机制实现阻塞功能,特别强调了wait条件判断需要使用while循环而非if语句的重要性。阻塞队列能有效解耦生产者和消费者

2025-11-24 13:14:13 631

原创 Java多线程案例--单例模式

单例模式确保类只有一个实例,分为饿汉和懒汉两种实现方式。饿汉模式在类加载时就创建实例,实现简单但可能造成资源浪费;懒汉模式在首次使用时创建实例,更节省资源但需要考虑线程安全问题。线程安全的懒汉模式通过双重检查锁和volatile关键字来优化性能。两种方式都通过私有化构造方法防止外部实例化,提供静态方法获取唯一实例。

2025-11-23 13:15:55 302

原创 Java中线程安全问题的原因和解决方案

本文探讨了Java中的线程安全问题及其解决方案。多个线程同时修改共享资源会导致线程不安全,如两个线程对同一static变量进行50万次自增,结果会小于预期的100万。这是由于++操作的非原子性(读-改-写)被线程抢占式执行打断。解决方案包括使用synchronized同步块保证原子性,要求使用同一锁对象。synchronized具有可重入特性,但不当使用仍可能导致死锁(如两个线程互相持有对方需要的锁)。此外还介绍了volatile关键字解决内存可见性问题(防止JVM优化导致线程读取过时数据)和指令重排序问题

2025-10-25 19:36:51 614

原创 Java 线程的几种状态

Java线程状态包括NEW(新建未启动)、RUNNABLE(可运行或正在运行)、BLOCKED(锁竞争阻塞)、WAITING(无限等待)、TIMED_WAITING(限时等待)和TERMINATED(终止)。状态转换条件:调用start()从NEW到RUNNABLE;锁竞争失败从RUNNABLE到BLOCKED;获取锁后返回RUNNABLE;调用sleep()等进入TIMED_WAITING;超时或中断返回RUNNABLE;执行完毕或异常则变为TERMINATED。这些状态描述了线程完整的生命周期。

2025-10-19 15:10:39 364

原创 Thread 类的基本用法

本文介绍了Java中线程创建与操作的基本方法。主要内容包括:1)通过继承Thread类或实现Runnable接口创建线程;2)使用匿名内部类和Lambda表达式简化线程创建;3)线程中断机制(interrupt)及标志位使用;4)线程等待(join)方法实现线程顺序执行;5)线程休眠(sleep)控制执行速度;6)获取线程实例信息(name、id)的方法。文章通过HelloWorld示例演示了线程的基本操作,并解释了相关概念如标志位、抢占式执行等。

2025-10-19 14:00:03 659

原创 进程和线程的区别和联系

本文通过月饼的比喻生动解释了进程和线程的关系:将月饼堆比作进程,吃月饼的人比作线程。指出线程作为进程的执行单元,能提高任务处理效率,但过多线程可能导致资源争夺冲突。文章强调需要合理分配进程和线程数量,在提高吞吐量的同时避免资源竞争,并总结出线程是进程的组成部分、都支持并发执行、引入线程能降低开销等核心要点。

2025-10-14 02:13:06 151

原创 进程调度的基本过程

冯诺依曼体系是现代计算机的基础架构,由运算器、控制器、存储器、输入和输出设备五大部件组成。CPU集成了运算器和控制器,存储器分为内存(运存)和外存(硬盘等),而输入输出设备如键盘、鼠标、显示器等实现人机交互。该体系核心在于运算控制与存储分离。CPU执行分为取指令、译码、执行和写回四个步骤。进程调度通过分时复用技术,使少量CPU核心能处理大量进程,涉及状态管理、优先级调整、记账信息和上下文保存等机制,确保系统高效运行。不同设备通过灵活调整进程优先级实现性能优化。

2025-10-04 00:15:09 495

原创 数据结构Java--8

本文介绍了二叉搜索树(BST)的基本概念和实现方法,包括查找、插入和删除操作,并分析了单支BST的效率问题。随后讲解了Map和Set两种高效搜索容器,其中Map采用Key-Value模型,Set采用Key模型,重点阐述了TreeMap和TreeSet基于红黑树的实现。最后介绍了哈希表原理,包括哈希函数、冲突解决方法(开散列和闭散列)以及哈希桶的实现,对比了HashMap(哈希桶)和TreeMap(红黑树)的性能差异。文章还提供了Java中HashSet和HashMap的具体使用方法。

2025-08-27 22:10:22 983

原创 数据结构Java--7

本文介绍了常见的排序算法及其特性。主要内容包括:插入排序(稳定,O(N²))、希尔排序(不稳定,优化插入排序)、选择排序(不稳定,O(N²))、堆排序(不稳定,O(NlogN))、冒泡排序(稳定,O(N²))、快速排序(不稳定,O(NlogN))和归并排序(稳定,O(NlogN))。重点分析了各算法的实现原理、时间/空间复杂度及稳定性,其中快速排序通过"三数取中"优化基准选择,归并排序采用分治思想。文章还对比了不同算法的适用场景,如插入排序对接近有序数据效率高,归并排序适合外排序等。

2025-08-08 03:28:58 762 1

原创 数据结构Java--6

优先级队列是一种支持按优先级处理元素的数据结构,适用于需要优先处理高优先级任务的场景。堆是实现优先级队列的常用结构,分为大根堆和小根堆。文章详细介绍了堆的创建、插入、删除等操作,包括向下调整和向上调整算法。在Java中,PriorityQueue默认建立小根堆,可通过比较器或Lambda表达式实现大根堆。文章提供了完整的代码实现,包括堆的基本操作和PriorityQueue的使用方法。

2025-08-01 17:58:44 816

原创 数据结构Java--5

本文系统介绍了树形数据结构,重点阐述二叉树特性及操作。树结构需满足子树不相交、唯一父节点等条件,其基本概念包括度、叶子节点、层次等。二叉树作为特殊树形结构,要求节点度≤2且子树有序,包含满二叉树和完全二叉树两种特殊形式。文章详细讲解了二叉树的5个重要性质,并介绍了孩子表示法的存储实现。在操作方面,重点演示了前序、中序、后序和层序遍历的递归实现方法,其中层序遍历需借助队列完成。通过代码示例展示了二叉树的创建和四种遍历方式的实现过程。

2025-07-27 01:50:48 722

原创 数据结构Java--4

栈stack 队列queue 双端队列deque 集合框架图

2025-07-18 21:18:52 566

原创 数据结构Java--3

链表 LinkedList

2025-07-17 17:32:26 331

原创 数据结构Java--2

顺序表

2025-07-09 23:07:01 827

原创 数据结构Java--1

数据结构是一门单独的学科,并不区分语言。本博客以Java为例子,我会尽可能的用简单易懂的语言来总结和解释我所学习的内容。另外在这里给喜欢阅读的小伙伴推荐一本书,程杰老师的《大话数据结构》这本书通篇都是白话,阅读难度不大,适合刚接触数据结构的小白。本系列博客都将在JDK1.8 和 Intellij IDEA 的环境下进行演示和运行。

2025-07-05 19:20:51 1023

原创 Java基础语法实现简易图书管理系统

Java简易图书管理系统

2025-03-18 22:07:04 716

原创 Java基础语法,面向对象-6

抽象类接口

2025-03-18 14:14:06 801

原创 Java基础语法,面向对象-5

多态

2025-03-15 16:39:04 801

原创 Java基础语法,面向对象-4

面向对象----继承

2025-03-11 00:56:16 1018

原创 Java基础语法,面向对象-3

如果我们写了很多的类全部直接存放在src文件夹里,这样会导致有联系直接的类和其他无联系直接的类关系很混乱。所以这个时候我们利用包。在IntelliJ IDEA中我们可以右键src文件夹来创建包(package) IDEA 2022在现阶段包的定义类似于我们Windows操作系统里的文件夹一样,包名尽量指定成唯一的名字,我们也可以在包中再创建包以实现多层分割的效果。这里我们创建了两个包,可以根据我们创建的项目路径找到他们,可以发现创建包实际上就是创建一个文件夹。

2025-03-05 00:40:42 918

原创 Java基础语法,面向对象-2

如果在变量前面加上了this.,那么他就代表着这个变量是类里的成员变量,从而达到对成员变量修改的目的,这样即使和方法形参的名字有重复也不会有问题,而且还提高了代码的阅读性,让人看到this.就明白,这个变量是成员变量,而并非形参,哪个对象调用就是哪个对象的引用类型。可以发现我们在实例化的时候并没有传参,于是编译器就调用了不带参数的构造方法,然后用了不带参数的构造方法里的this引用,通过this传了三个参数,最后找到带三个参数的构造方法。但是在对象和类中,成员变量是可以不进行手动的初始化的。

2025-02-28 12:00:00 899

原创 Java基础语法,面向对象-1

面向对象是一种思想举个例子,假设你是一个大老板,有一天你的车坏了,这个时候你叫你的秘书去买一辆新的车,你只需要告诉你的秘书你想要什么车,但是对于秘书来说要做的事情有很多。。。然而作为老板的你只关心结果,并不在意秘书买车的过程,这个时候其实画绿色圈起来的内容是和你无关的,你不需要关注其中的细节,这其实就是面向对象的思想。就像我们使用洗衣机一样,我们只在意衣服是否洗干净,我们不会去研究洗衣机到底是怎么把衣服洗干净,或是研究洗衣机要转几圈能把衣服洗干净这种问题。

2025-02-25 12:36:04 842

原创 C语言扫雷简易版教程

C语言扫雷简易版

2024-12-01 14:14:46 1008

原创 C语言的三子棋简单小游戏教程

三子棋

2024-11-29 12:25:54 1123

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除