37k 33 分钟

🚀本篇章代码 Demo # 多线程概念 在现代操作系统中启动某一个程序时,操作系统就会为其创建一个进程,而在操作系统中调度最小单位是线程,也被称为轻量级进程,在一个进程里面可以创建多个线程,它们都拥有各自的计数器、栈、堆、局部变量等属性,并且可以访问共享内存变量。 进程:操作系统中正在运行的程序,是系统进行资源分配和调用的独立单位,每一个进程都拥有它自己的内存空间和系统资源。 线程:线程是进程中的单个顺序控制流,一个进程如果只有一条执行路径则被称为单线程程序,而如果一个进程有多条执行路径则被称为多线程程序。 # 多线程创建 & 启动 多线程有两种创建方法,第一种是继承...
4.1k 4 分钟

# AspectJ 概述 AspectJ 它是一个基于 Java 语言的 AOP 框架,提供了强大的 AOP 功能。 AspectJ 是 Java 语言的一个 AOP 实现,其主要包括两个部分:第一个部分定义了如何表达、定义 AOP 编程中的语法规范,通过这套语言规范,我们可以方便地使用 AOP 来解决 Java 中存在的交叉关注点问题,另一个部分是工具部分,包括编译器、调试工具等。 AspectJ 是最早功能比较强大的 AOP 实现之一,对整套 AOP 机制都有较好地实现,很多其它语言的 AOP 实现,也借鉴或采纳了 AspectJ 中的很多设计。在 Java 领域, AspectJ...
36k 33 分钟

# 前言 🚀本章代码示例 # 关于 OOP 的概念 OOP 是面向对象的程序设计,在谈到 OOP 程序设计前,我们不得不了解一下 POP 即面向过程的程序设计, POP 它是以功能为中心进行思考和组织的一种编程方式,强调的是系统数据被加工处理的过程,而 OOP 则注重封装,强调整体性的概念,以对象为中心,将对象内部组织与外部环境区分开来。 至于 OOP 的出现对 POP 存在很多颠覆性的,不能说 POP 没有了价值,只是不同时代的产物,从方法论来讲,更喜欢将面向对象与面向过程看做是事物的两个方面,那就是局部与整体 (必须注意局部与整体是相对的),在实际应用中,两者方法都同样重要。 在...
61k 56 分钟

# SpringIOC 概述 🚀本篇章代码 Demo 在日常开发中,创建对象的操作随处可见以至于对其十分熟悉又感觉很繁琐,每次需要对象都需要亲手 new 一个对象出来,甚至某些情况下由于不好的编程习惯可能还会造成对象无法被回收,就会非常糟糕,我们一直提倡的松耦合,少入侵原则,这种情况下变得一无是。前辈们开始谋求改变这种编程陋习,考虑如何使编码更加解耦合,由此而来的解决方法是面向接口编程,未使用接口和使用接口后的代码如下: # 1️⃣ 使用接口前的做法 - before SystemDaoImpl.javapackage top.rem.rain.demo1.before;import...
35k 31 分钟

# Specification This document is the community review draft of the JSR-133 specification, the Java Memory Model (JMM) and Thread Specification. This specification is intended to be part of the JSR-176 umbrella for the Tiger (1.5) release of Java, and is intended to replace Chapter 17 of the Java...
15k 14 分钟

本篇是对 Java 内存模型 ( JMM ) 及 volatile 关键字的深度记录,从而彻底理解 JMM 和 volatile 关键字的作用。 # Java 内存区域与内存模型 # Java 内存区域 Java 虚拟机在运行程序时会把自动管理的内存划分为以下几个区域,每个区域都有各自的用途以及创建和销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,绿色部分代表的是每个线程私有的数据区域。 Method Area(方法区) : 方法区又被称为: Non-Heap 属于线程共享的内存区域,主要用于存储已被虚拟机加载的类信息、常量、静态变量、通过即时编译器编译后的代码等数据,根据...
25k 23 分钟

本篇章是对 Java 并发中的 synchronized 关键字进行深入探索。🚀本篇章代码 Demo # 序言 线程安全是并发编程中的重要关注点,应该注意的是,造成线程安全问题的主要原因有以下两点: 1️⃣ 是存在共享数据 (临界资源)。 2️⃣ 存在多条线程共同操作共享数据。 为了解决这个问题,我们需要这样一个方案,当存在多个线程操作共享数据时,需要保证同一个时刻有且只有一个线程在操作共享数据,其它线程必须等到该线程处理完数据后再进行。 这种方式的名称叫 互斥锁 ,即能达到互斥访问目的的锁,也就说当一个共享数据被当前正在访问的线程加上 互斥锁...
14k 12 分钟

本章是:为什么重写 equals() 方法时一定要重写 hashCode() 方法深入解析。 # equals 和 hashCode 是什么 在 Java 开发中每个对象都有一个默认的 equals() 方法,它比较的是对象的引用是否相等 (即:比较两个对象是否是同一个实例)。但是在实际开发中,我们通常需要比较对象的内容是否相等,而不仅仅是比较它们的引用。这就是为什么我们要重写 equals() 方法的原因。 hashCode(哈希码) 是另一个与对象相关的重要概念,哈希码是一个整数值,它是根据对象的内容计算得出的,在 Java...
6.8k 6 分钟

# 基础概念 我们先来了解一下相关的基础概念:机器码、真值、原码、反码、补码。 # 1️⃣ 机器码 我们知道无论是代码还是数值,在计算机中最后都转换成了二进制的形式存在,而一个数值在计算机中的二进制表示形式,就是这个数的机器码。 机器码是有符号位的,在计算机中用一个二进制数的最高位存放符号,正数为 0 ,负数为 1 。 示例如下 (使用原码表示): 十进制的 +5 ,计算机字长为 8 位,其二进制是 00000101 。 十进制的 -5 ,计算机字长为 8 位,其二进制是 10000101 。 其中的 00000101 和 10000101 就是机器码。 # 2️⃣...
65k 59 分钟

在 Java 5 中新增了枚举类型,它是一种特殊的数据类型,之所以特殊是因为它是一种 class 类型却又比 class 类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。🚀本篇章代码 Demo # 定义枚举 下面这是在没有枚举类型的情况下定义常量常见的方法如下: OrdinaryConstantDemo.java本示例使用JAVA 8package top.rem.rain;/** * @Author: LightRain * @Description: 普通方式定义常量 * @DateTime: 2023-12-05 21:14 *...