自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 用信号量解决哲学家进餐问题

哲学家进餐问题是一个经典的并发编程问题,它涉及到一群哲学家坐在圆桌周围进餐。每个哲学家都必须完成两个任务:思考和就餐。他们之间共享一些餐具,如叉子,但每个哲学家在就餐时需要同时拿到左手和右手的叉子。如果某个哲学家左右两边的叉子都被其他哲学家拿走了,那么他就无法进餐,就会陷入饥饿状态,最终可能导致死锁。

2024-04-05 09:00:00 209

原创 详解TCP/IP五层模型

TCP/IP模型是一个网络通信体系结构,由五层组成,每一层都有其特定的功能。应用层传输层网络层数据链路层物理层每一层都有不同的责任,通过这种层次结构,网络通信可以更有效地进行。

2024-04-04 13:59:53 1863

原创 File类详解

在Java编程中,File类是用于表示文件系统中的文件或目录的抽象表示。它提供了一种用于访问和操作文件系统的方式。本文将详细介绍Java中的File类,包括其属性、构造方法、常用方法,并提供相关的代码示例。

2024-04-02 13:18:12 444

原创 了解Java文件操作和IO

引言:在Java编程中,文件操作是一项基本且常见的任务。无论是读取、写入还是管理文件,Java都提供了丰富的API和工具来简化这些操作。本文将深入探讨Java中的文件操作,并举例说明如何使用Java来处理文件。

2024-04-02 13:02:21 356

原创 Java中的信号量Semaphore

信号量Semaphore是一种用于控制多个线程访问共享资源的同步工具。它通过维护一个计数器来控制对共享资源的访问,当资源被一个线程占用时,计数器减一;当资源被释放时,计数器加一。当计数器为0时,表示资源已被全部占用,新的线程需要等待其他线程释放资源。

2024-04-01 22:56:38 482

原创 详解ExecutorService 和 Executors

代码示例:代码示例:ExecutorService 表⽰⼀个线程池实例.Executors 是⼀个⼯⼚类, 能够创建出⼏种不同⻛格的线程池.ExecutorService 的 submit ⽅法能够向线程池中提交若⼲个任务.Executors 创建线程池的⼏种⽅式newFixedThreadPool: 创建固定线程数的线程池newCachedThreadPool: 创建线程数⽬动态增⻓的线程池.newSingleThreadExecutor: 创建只包含单个线程的线程池.

2024-04-01 22:52:25 505

原创 CAS 的 ABA 问题

线程 t1 的 CAS 是期望 num 不变就修改. 但是 num 的值已经被 t2 给改了. 只不过⼜改成 A 了. 这个时候 t1 究竟是否要更新 num 的值为 Z 呢?但是, 在 t1 执⾏这两个操作之间, t2 线程可能把 num 的值从 A 改成了 B, ⼜从 B 改成了 A。轮到线程2 执⾏了, 发现当前存款为 100, 和之前读到的 100 相同, 再次执⾏扣款操作。轮到线程2 执⾏了, 发现当前存款为 50, 和之前读到的 100 不相同, 执⾏失败.这个时候, 扣款操作被执⾏了两次!

2024-03-31 22:56:03 492

原创 详解CAS(Compare and swap)

一、什么是 CAS一、什么是 CASCAS: 全称Compare and swap,字⾯意思:”⽐较并交换“,⼀个 CAS 涉及到以下操作:我们假设内存中的原数据V,旧的预期值A,需要修改的新值B。比较 A 与 V 是否相等。(⽐较)如果⽐较相等,将 B 写⼊ V。(交换)返回操作是否成功。CAS 伪代码下⾯写的代码不是原⼦的, 真实的 CAS 是⼀个原⼦的硬件指令完成的. 这个伪代码只是辅助理解 CAS的⼯作流程.两种典型的不是 "原⼦性" 的代码。

2024-03-31 22:43:44 617

原创 Java中常见的锁策略

乐观锁 vs 悲观锁悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别⼈会修改,所以每次在拿数据的时候都会上锁,这样别⼈想拿这个数据就会阻塞直到它拿到锁。乐观锁:假设数据⼀般情况下不会产⽣并发冲突,所以在数据进⾏提交更新的时候,才会正式对数据是否产⽣并发冲突进⾏检测,如果发现并发冲突了,则让返回⽤⼾错误的信息,让⽤⼾决定如何去做。举个栗⼦: 同学 A 和 同学 B 想请教⽼师⼀个问题.

2024-03-31 22:29:58 687

原创 Java 线程池

引言:在 Java 编程中,线程池是一种重要的多线程处理机制,它可以有效地管理和复用线程,提高了多线程程序的性能和可靠性。本文将详细介绍 Java 中线程池的概念、好处,并演示如何自己实现一个简单的线程池。

2024-03-31 16:24:17 398

原创 Java 中的单例模式

引言:在 Java 编程中,单例模式是一种常见的设计模式,它保证一个类只能创建一个实例,并提供一个全局访问点。单例模式在很多场景下都非常有用,比如线程池、日志系统、数据库连接池等。本文将详细介绍 Java 中单例模式的实现方式,并通过示例说明其在实际应用中的应用场景。

2024-03-31 15:33:20 1078

原创 详解Java 中的 wait 和 notify 方法

wait(): 当一个线程执行了wait()方法后,它会释放当前持有的对象锁,并进入等待状态,直到其他线程调用了相同对象上的notify()或方法将其唤醒。notify(): 用于唤醒一个正在等待的线程。调用notify()方法会随机唤醒等待队列中的一个线程,并使其从wait()方法返回。: 用于唤醒所有正在等待的线程。调用方法会唤醒等待队列中的所有线程,使它们从wait()方法返回。wait()和notify()方法是 Java 多线程编程中非常重要的工具,能够实现线程间的协作和通信。

2024-03-31 15:12:54 306

原创 详解 Java 中的 volatile 关键字

volatile 能保证内存可见性引言:在 Java 编程中,volatile是一个非常重要的关键字,用于修饰变量。它主要用于确保多个线程之间对共享变量的修改能够被及时地更新到主内存,并且能够保证可见性。然而,需要注意的是,volatile关键字并不具备原子性,这就意味着在某些情况下,仅仅使用volatile是不足够的。本文将深入探讨volatile关键字的使用及其特性。

2024-03-31 14:43:51 914

原创 synchronized 关键字 - 监视器锁 monitor lock

synchronized 的特性及使用示例

2024-03-31 14:24:46 990

原创 详解 Java多线程带来的的风险-线程安全

线程安全是指在多线程环境中,对共享资源的访问不会导致数据的损坏或不一致。一个线程安全的程序在多线程环境下执行时,能够确保各个线程都能正确地操作共享的数据,而不会产生意外结果。

2024-03-31 14:08:48 1228

原创 详解Java线程的状态

观察线程的所有状态。

2024-03-31 13:51:35 180

原创 常用的6个的ChatGPT网站,国内可用!

利用GPTGod探索GPT-4的。,为你的应用或项目带来智能升级。

2024-03-30 17:15:37 921

原创 滑动窗口算法详解及应用示例

引言:滑动窗口算法是一种用于解决数组/字符串问题的有效技巧。它可以用来解决一系列问题,例如求解子数组/子字符串的最大值、最小值、平均值、和、特定条件下的个数等。在本篇博客中,我们将详细介绍滑动窗口算法的原理,并通过几个具体的题目示例来加深理解。

2024-03-30 13:32:18 576

原创 Thread 类及常见方法

引言:Thread 类是 JVM ⽤来管理线程的⼀个类,换句话说,每个线程都有⼀个唯⼀的 Thread 对象与之关联。每个执⾏流,也需要有⼀个对象来描述,⽽ Thread 类的对象 就是⽤来描述⼀个线程执⾏流的,JVM 会将这些 Thread 对象组织起来,⽤于线程调度,线程管理。

2024-03-30 13:04:53 932

原创 认识线程(Thread)

引言:在Java编程中,线程(Thread)是一项重要的概念,它使得程序能够同时执行多个任务,提高了程序的效率和响应速度。本文将介绍Java线程的基本概念、创建方式以及多线程的优势。一、概念1、 线程是什么⼀个线程就是⼀个 "执⾏流". 每个线程之间都可以按照顺序执⾏⾃⼰的代码. 多个线程之间 "同时" 执⾏着多份代码。2、为啥要有线程?⾸先,"并发编程" 成为 "刚需"。单核 CPU 的发展遇到了瓶颈. 要想提⾼算⼒, 就需要多核 CPU. ⽽并发编程能更充分利⽤多核 CPU资源.

2024-03-27 22:30:24 811

原创 快速幂算法在Java中的应用

快速幂算法,也称为二分幂算法,通过将指数进行二进制拆分,从而减少幂运算的次数,从而提高计算效率。其基本思想是利用指数的二进制表示来降低计算时间复杂度,使得幂运算的时间复杂度从O(n)降低到O(logn)。

2024-03-27 21:53:54 625

原创 泛型的通配符及擦除机制详解

一、引言:在这篇文章中,我主要介绍前一篇泛型没介绍完整的泛型通配符?用于在泛型的使用,即为通配符一、以上程序会带来新的问题,如果现在泛型的类型设置的不是String,而是Integer.我们需要的解决方案:可以接收所有的泛型类型,但是又不能够让用户随意修改。这种情况就需要使用通配符""来 处理示例:使用通配符。

2024-03-26 12:37:05 378

原创 详解Java 中的 Lambda 表达式

/ 使用 Lambda 表达式实现自定义 Comparator// 打印排序后的结果通过以上例子,我们可以看到 Lambda 表达式在简化代码、提高代码可读性方面的优势。在实际开发中,Lambda 表达式可以大大简化代码编写,提升开发效率。总结:Lambda 表达式是 Java 8 中一个重要的特性,它使得 Java 支持函数式编程风格,让代码更加简洁、易读。通过 Lambda 表达式,我们可以更加方便地实现函数式接口和简化代码,提高开发效率。

2024-03-25 20:17:19 491

原创 详解Java枚举类型

引言:随着Java语言的不断发展,枚举类型(Enum)成为了Java编程中不可或缺的一部分。本文将深入探讨枚举类型的背景意义、使用方法、常用方法以及优缺点,帮助读者更好地理解和应用枚举类型。

2024-03-24 15:03:41 780

原创 Java中的反射机制

反射是Java语言提供的一种能力,可以让程序在运行时检查和操作类、接口、方法以及类中的成员等。反射机制为开发者提供了动态操作类的能力,使得程序更加灵活、具有更高的可扩展性。在运行时获取类的信息,如类名、属性、方法等。动态创建对象实例。调用对象的方法和操作成员变量。实现通用的代码设计,如框架、插件等。

2024-03-24 09:15:00 1264

原创 Java中的Timer类以及自己实现一个MyTimer

Timer类是 Java 提供的用于执行定时任务的工具类。它允许你安排任务在未来的某个时间点执行,也可以定期执行。下面是关于Timer。

2024-03-23 12:42:19 286

原创 Java字符串常量池

引言:在Java编程中,字符串常量池一直是一个备受关注的话题。本文将从创建对象的思考、字符串常量池、再谈String对象创建等方面深入探讨Java字符串常量池。

2024-03-23 10:58:01 680 1

原创 深度优先搜索(DFS)与广度优先搜索(BFS)在 Java 中的应用

在算法和数据结构中,深度优先搜索(Depth First Search,DFS)和广度优先搜索(Breadth First Search,BFS)是两种常用的图遍历算法。广度优先搜索是一种利用队列实现的图遍历算法,其基本思想是从起始节点开始,先访问其所有相邻节点,然后再依次访问这些相邻节点的相邻节点,以此类推,直到所有可达节点都被访问过。深度优先搜索是一种递归的图遍历算法,其基本思想是从起始节点开始,沿着一条路径一直往下走,直到走到尽头,然后返回上一个节点继续探索其他路径,直到所有的节点都被访问过为止。

2024-03-20 17:05:18 332

原创 Java集合框架中的Map和Set

我们将详细介绍它们的概念、使用方法以及常用的方法,最后还会提供一些相关的练习题目。每个键都必须是唯一的,但值可以重复。Java提供了多种实现Map接口的类,其中最常用的是HashMap、TreeMap和LinkedHashMap。它提供了一种存储不同元素的方法,确保集合中的每个元素都是唯一的。3、使用TreeMap实现一个简单的字典,其中键为单词,值为单词的解释,然后按照单词的字典顺序输出所有单词及其解释。1、创建一个HashMap实例,添加若干个学生的姓名和对应的分数,然后遍历输出所有学生的姓名和分数。

2024-03-17 13:01:12 922

原创 深入了解 AVL 树

引言:AVL 树是一种自平衡二叉搜索树,它能够保持树的平衡性,从而提高了搜索、插入和删除操作的效率。在本文中,我们将深入探讨 AVL 树的概念、使用场景,并通过 Java 实现一个简单的 AVL 树。

2024-03-11 11:31:24 358

原创 Java中的排序算法

引言:当谈到编程语言中的排序,Java 作为一种广泛使用的编程语言,提供了许多强大的排序算法来满足不同的需求。排序是一种将一组数据按照特定顺序重新排列的过程,通常是按照升序或降序排列。在 Java 中,我们可以利用内置的排序方法,也可以自定义排序算法来实现排序功能。

2024-03-04 16:43:05 491

原创 深入理解Java中的优先级队列(堆)——PriorityQueue

优先级队列(PriorityQueue)是一种基于堆结构实现的队列,其中每个元素都有一个优先级,优先级高的元素在队列中具有更高的优先级,排在前面。优先级队列常用于任务调度、事件处理等场景。本文将详细介绍Java中的优先级队列(基于堆实现)及提供示例来帮助理解。

2024-02-29 22:40:12 864

原创 深入理解Java中的二叉树

二叉树是由节点组成的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。每个节点最多有两个子节点。左子节点总是在父节点的左边,右子节点总是在父节点的右边。二叉树的子树仍然是二叉树。

2024-02-05 16:23:11 1101

原创 Java数据结构之二叉树——前置知识

引言:当代软件开发中,树是一种常见的数据结构,尤其在Java语言中。树的概念可以在许多不同的领域找到应用,包括算法、数据存储和图像处理等方面。本篇博客将详细介绍Java中树的概念、特点和常见应用。

2024-02-05 16:06:16 884

原创 深入理解Java中的队列(Queue)

队列是一种线性数据结构,它的特点是先进先出。在队列中,元素的添加(入队)操作在队尾进行,而元素的移除(出队)操作则在队头进行。因此,队列可以被简单地描述为一个“先进先出”的容器。在Java中,队列接口继承自Collection接口,并提供了丰富的方法来操作队列中的元素。

2024-01-24 15:35:50 1601

原创 深入理解Java中的栈(超详细)新手必看

栈(Stack)是一种常见的数据结构,具有后进先出(LIFO,Last In First Out)的特性,即最后入栈的元素最先出栈。栈通常用于存储临时性的数据,如方法调用过程中的局部变量、操作数栈等。在计算机科学中,栈的应用非常广泛,包括编程语言中的函数调用、内存分配以及表达式求值等领域。在Java编程语言中,栈也被广泛应用于方法调用和内存管理的过程中。双端栈(Double Ended Stack),也被称为双端队列(Deque),是一种支持在两端进行插入和删除操作的数据结构。

2024-01-21 19:33:37 4013 2

原创 探究Java中的链表

在Java编程中,链表是一种常见的数据结构,具有灵活的内存管理和动态的元素插入与删除能力。本篇博客将深入探讨链表的结构和概念,比较链表与顺序表的区别,介绍Java中LinkedList的常用函数并通过示例说明LinkedList的使用。

2024-01-20 20:31:12 1164

原创 了解Java中ArrayList类的使用

引言:在Java中,ArrayList是一个非常常用的动态数组实现,它提供了一种灵活的方式来存储和操作数据集合。ArrayList是Java集合框架中的一部分,它允许我们在运行时动态地添加或删除数据,并提供了许多便利的方法来操作列表中的元素。

2024-01-17 19:51:34 352

原创 Java中泛型的详细介绍

在泛型类中,我们可以使用泛型来代替具体的类型。例如,我们可以创建一个泛型类Box,其中T表示类型参数,可以是任意合法的Java类型。通过这种方式,我们可以使用Box类来存储不同类型的对象,而无需创建多个不同的类。与泛型类类似,我们也可以定义泛型接口。例如,我们可以创建一个泛型接口List,其中T表示类型参数。// 省略实现// 使用泛型类// 返回 10// 返回 "Hello"泛型接口:// 实现泛型接口@Override// 添加元素到数组。

2024-01-17 19:30:23 1139

原创 Java自定义异常类详解及示例

自定义异常类是我们根据业务需求自定义的异常类型。它们继承自Java中的Exception或它的子类(一般继承RuntimeException类),并且扩展了一些特定的属性和方法。自定义异常类可以用于表示特定业务或系统中的错误,提供详细的错误信息,方便程序员或开发者理解和处理异常情况。提供更好的错误信息:自定义异常类可以包含自定义的错误信息,方便查找和调试代码问题。区分不同类型的异常:通过自定义异常类,我们可以将不同类型的异常归类,并根据需要采取不同的处理方式。

2023-11-20 22:12:54 750

空空如也

空空如也

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

TA关注的人

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