摘要: 表锁 行锁 间隙锁 阅读全文
posted @ 2024-07-16 21:18 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 归并排序 原理 归并排序的原理是这样的,比如一开始我们有数组[9,6,3,2,5,8,7,4,1,0] 然后我们开始平分并递归 [9,6,3,2,5,8,7,4,1,0] [9,6,3,2,5] [8,7,4,1,0] [9,6,3] [2,5] [8,7,4] [1,0] [9,6] [3] [2 阅读全文
posted @ 2024-07-16 17:24 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 进程 进程、线程、协程的概念 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。 协程:是一种比线程更加轻量级的存在。一个线程也可以拥有多 阅读全文
posted @ 2024-07-16 15:40 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: HashMap 数据结构 HashMap是:数组+链表/红黑树(JDK1.8增加了红黑树部分) 数据底层具体存储的是Node<k,v> 这样的存储方式有什么优点呢? // 默认初始容量(数组默认大小):16,2的整数次方 static final int DEFAULT_INITIAL_CAPACI 阅读全文
posted @ 2024-07-15 22:43 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 状态转换 Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一种状态,并且可以通过特定的方法在不同状态之间转换。这6种状态分别是: 新建(New):创建后尚未启动的线程处于这种状态, 运行(Runnable):包括操作系统线程状态中的Running和Ready,也就是处于 阅读全文
posted @ 2024-07-15 20:42 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: sleep()、wait()、join()、yield() yield 在Java中,yield() 是一个Thread类的静态方法,它用于暂停当前线程并允许其他线程运行。它是一种线程调度的建议,告诉调度器可以切换到其他就绪状态的线程。调用yield()方法后,线程会从运行状态转换为就绪状态,让其他 阅读全文
posted @ 2024-07-14 22:32 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 线程 你可能已经很熟悉多任务(multitasking),这是操作系统的一种能力,看起来可以在同一时刻运行多个程序。例如,在编辑或下载邮件的同时可以打印文件。如今,人们往往都有多CPU的计算机,但是,并发执行的进程数目并不受限于CPU数目。操作系统会为每个进程分配CPU时间片,给人并行处理的感觉。多 阅读全文
posted @ 2024-07-14 21:42 Duancf 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 可重入锁 ReentrantLock 锁对象 为什么需要锁对象 因为我们不希望有些操作被打断,例如在银行取钱的程序中,线程A正在从账户中取钱,他会进行三个操作, 读取账户金额100, 在自己的工作内存中对账户金额-100, 把0写回账户金额, 但是在第1,2步中间被线程B打断,线程B执行同样的操作, 阅读全文
posted @ 2024-07-14 21:05 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: Java与协程 在Java时代的早期,Java语言抽象出来隐藏了各种操作系统线程差异性的统一线程接口,这曾经是它区别于其他编程语言的一大优势。在此基础上,涌现过无数多线程的应用与框架,譬如在网页访问时,HTTP请求可以直接与Servlet API中的一条处理线程绑定在一起,以“一对一服务”的方式处理 阅读全文
posted @ 2024-07-14 21:03 Duancf 阅读(2) 评论(0) 推荐(0) 编辑
摘要: OutOfMemoryError异常 阅读全文
posted @ 2024-07-14 20:56 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 对象的创建 Java是一门面向对象的编程语言,Java程序运行过程中无时无刻都有对象被创建出来。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? 当Java虚 阅读全文
posted @ 2024-07-14 20:54 Duancf 阅读(3) 评论(0) 推荐(0) 编辑
摘要: 概述 阅读全文
posted @ 2024-07-13 19:33 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: [Redis]跳跃列表详解 阅读全文
posted @ 2024-07-13 19:33 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: Redis 早期版本存储 list 列表数据结构使用的是压缩列表 ziplist 和普通的双向链表 linkedlist,也就是说当元素少时用 ziplist,当元素多时用 linkedlist。 //链表的节点 struct listNode<T>{ listNode* prev; listNod 阅读全文
posted @ 2024-07-13 19:33 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: [Redis]跳跃列表详解 阅读全文
posted @ 2024-07-13 19:33 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: Redis 为了节约内存空间使用,zset 和 hash 容器对象在元素个数较少的时候,采用压缩列表(ziplist)进行存储。压缩列表是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。 >zadd programmings 1.0 go 2.0 python 3.0 java (inte 阅读全文
posted @ 2024-07-13 18:36 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 分布式应用进行逻辑处理时经常会遇到并发问题。 如图所示,一个操作要修改用户的状态。修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。 如果这样的操作同时进行,就会出现并发问题,因为“读取”和“保存状态”这两个操作不是原子操作。 原子操作是指不会被线程调度机制打断的操作。这种操作一旦开始 阅读全文
posted @ 2024-07-13 18:36 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: SDS Redis 中的字符串是可以修改的字符串,在内存中它是以字节数组的形式存在的。我们知道 C 语言里面的字符串标准形式是以 NULL(即 0x\0)作为结束符,但是在Redis 里面,字符串不是这么表示的。因为要获取以 NULL 结尾的字符串的长度使用的是 strlen 标准库函数,这个函数的 阅读全文
posted @ 2024-07-13 15:43 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: (请注意redis在rdb持久化(bgsave)和重写aof(bgrewriteaof)的时候创建子线程) Redis 是个单线程程序!这点必须铭记。 也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了Redis 之 阅读全文
posted @ 2024-07-13 15:43 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 先来看实验,结论在最后 没有返回值,没有错误 public class Main { public static void main(String[] args) { test(); } public static void test() { try { System.out.println("tr 阅读全文
posted @ 2024-07-12 21:38 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 这个问题我看网上有人做了实验,是in的效率会比or高 去查了官方文档 expr IN (value,...) Returns 1 (true) if expr is equal to any of the values in the IN() list, else returns 0 (false) 阅读全文
posted @ 2024-07-12 19:43 Duancf 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 线程安全与锁优化 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题,被称为面向过程的编程思想。与此相对,面向对象的编程思想则站在现实世界的角度去抽象 阅读全文
posted @ 2024-07-12 16:56 Duancf 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 类加载 加载 java数据类型分为基本数据类型和引用数据类型, 基本数据类型由虚拟机预先定义,引用数据类型才需要类的加载过程。 类的加载,就是将java类的字节码文件加载到内存中,并通过字节码在内存中构建出类的原型 类模板对象。 jvm把字节码中的常量池,类字段,类方法等信息存储到类模板中,这样jv 阅读全文
posted @ 2024-07-12 16:52 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 垃圾回收机制 标记+清除 先标记哪些内存没有被引用,然后释放这些内存 注意,释放不代表要重写这些内存里的数据,只需要把这段内存的起始和结束的地址记录下来即可。 速度很快,但是很容易产生内存碎片 标记+整理 先标记哪些内存没有被引用,然后释放这些内存, 注意,释放内存之后要进行紧凑操作,也就是要把仍然 阅读全文
posted @ 2024-07-12 16:49 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 锁 阅读全文
posted @ 2024-07-12 16:35 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: MySQL 的数据都是存在磁盘中的,那么我们要更新一条记录的时候,得先要从磁盘读取该记录,然后在内存中修改这条记录。那修改完这条记录是选择直接写回到磁盘,还是选择缓存起来呢? 当然是缓存起来好,这样下次有查询语句命中了这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了。 为此,Innodb 存 阅读全文
posted @ 2024-07-12 16:31 Duancf 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 隔离级别 下面介绍四种因为事务的并发产生的问题: 脏写 假设银行账户中有100元, 有事务A,B A事务把余额改为200,但还未提交 这时,B事务把余额改为300,提交, 如果A发生了回滚,那么账户余额回到100元,事务B无效。 脏写就是已经提交的事务的写操作因为另一个还未提交的事务的回滚而失去效果 阅读全文
posted @ 2024-07-12 15:48 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 重传机制 TCP 实现可靠传输的方式之一,是通过序列号与确认应答。在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。 但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢? 所以 TCP 针对数据包丢失的情况,会用重 阅读全文
posted @ 2024-07-12 15:36 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: tcp的可靠性实现(一溜烟把rdt、流量控制、拥塞控制全答上去了) 4、介绍一下线程通信(synchronized、volatile、wait()/notify()这个不记得、管道输入/输出流、join也不记得、threadlocal) 5、介绍一下java并发里的锁(我从乐观锁和悲观锁两种里答,乐 阅读全文
posted @ 2024-07-12 14:42 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: sync.once 阅读全文
posted @ 2024-07-12 14:23 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: defer 阅读全文
posted @ 2024-07-12 14:23 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 逃逸分析 阅读全文
posted @ 2024-07-12 14:15 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 JDK 1.8 和之前的版本略有不同,我们这里以 JDK 1.7 和 JDK 1.8 这两个版本为例介绍。 JDK 1.7: JDK 1.8: 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线 阅读全文
posted @ 2024-07-11 21:19 Duancf 阅读(2) 评论(0) 推荐(0) 编辑
摘要: mmap 阅读全文
posted @ 2024-07-10 21:49 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 什么是数据复制/数据拷贝(Copy)? 拷贝(Copy)数据,主要包括两种:CPU拷贝/ DMA拷贝。 第一类拷贝:CPU 拷贝(CPU Copy) 在 CPU 拷贝中,数据的传输是由中央处理器(CPU)直接进行的。当数据需要从一个内存区域拷贝到另一个内存区域时,CPU 首先将数据从源内存区域读取到 阅读全文
posted @ 2024-07-10 10:01 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: SQL优化 避免使用select * 很多时候,为了方便,喜欢直接使用select *,一次性查出表中所有列的数据。 反例: select * from user where id=1; 在实际业务场景中,可能我们真正需要使用的只有其中一两列。查了很多数据,但是不用,白白浪费了数据库资源,比如:内存 阅读全文
posted @ 2024-07-09 21:36 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 反射 获取任意对象的数据 对对象一无所知的情况下 public class Student { private String name; private Integer age; public Student(String name, Integer age) { this.name = name; 阅读全文
posted @ 2024-07-09 19:27 Duancf 阅读(2) 评论(0) 推荐(0) 编辑
摘要: 数据类型 Java的数据类型包括基本数据类型和引用数据类型: 基本数据类型: 整形:byte, short, int, long 浮点型:float, double 字符型:char 布尔型:boolean 引用数据类型:class, interface, array。 引用拷贝,浅拷贝,深拷贝 引 阅读全文
posted @ 2024-07-09 19:26 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 面向对象 修饰符 接口 接口中方法的访问修饰符默认是public abstract 在 Java 接口中,接口中的方法默认是公共的(public),且不允许使用其他的访问修饰符。接口中定义的方法会被隐式地指定为 public abstract,这两个修饰符可以省略,因为它们是默认的。 所以,Java 阅读全文
posted @ 2024-07-09 19:24 Duancf 阅读(1) 评论(0) 推荐(0) 编辑
摘要: 多线程循环打印ABC 方法一: package org.example; import java.util.TreeMap; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Reentran 阅读全文
posted @ 2024-07-09 19:18 Duancf 阅读(1) 评论(0) 推荐(0) 编辑