自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Apache Drill 连接 MySQL 或 PostgreSQL 数据库

1.确保 MySQL/PostgreSQL 数据库已启动,且网络通畅(Drill 所在机器能访问数据库端口,如 MySQL 默认 3306,PostgreSQL 默认 5432)。实现,核心是通过 JDBC 驱动连接外部数据库。通过 Drill 的 SQL 交互界面(Web UI 或终端)执行查询,验证是否能访问数据库表。(选择与数据库版本兼容的驱动,如 8.0.x 或 5.1.x):主机 IP(或域名)、端口、数据库名、用户名、密码。(选择与数据库版本兼容的驱动,如 42.2.x)3.下载对应数据库的。

2025-11-06 10:53:53 736

原创 Centos 7安装Apache Drill

Oracle JDK。

2025-11-06 10:40:51 316

原创 ArrayList与CopyOnWriteArrayList

当执行添加、修改等写操作时,它会先复制一份新的数组进行操作,操作完成后再将原数组的引用指向新数组;这种读写分离的设计,让读操作永远不会被阻塞,写操作也不会影响正在进行的读操作,从根本上避免了多线程并发修改的冲突。(2)迭代或遍历过程中,一旦有线程修改了集合,会导致 modCount(修改次数)与迭代器记录的 expectedModCount 不一致,直接抛出 ConcurrentModificationException(并发修改异常)。的,因为它的核心方法(如 add、remove)没有任何同步机制。

2025-10-13 16:26:25 145

原创 ReentrantReadWriteLock读写锁相关知识

是 Java 并发包()中的实现,专为 “读多写少” 场景设计,核心是通过分离 “读锁” 和 “写锁”,允许,从而提升并发性能。

2025-09-25 17:19:52 880

原创 CountDownLatch相关知识

是 Java 并发包()中的。它的工作原理基于一个 “不可重置的计数器”,通过计数器的递减和阻塞等待,实现线程间的协同。

2025-09-24 15:05:27 417

原创 shutdown()和shutdownNow()的区别

在 Java 线程池()中,shutdown()和都是用于关闭线程池的方法,但它们的,核心差异体现在对 “正在执行的任务” 和 “队列中等待的任务” 的处理方式上。

2025-09-19 17:16:14 373

原创 HashMap的底层原理

2.JDK1.8版本中,HashMap采用数组+链表+红黑树的数据结构,对JDK1.7版本进行了优化,当一个数组的长度超过64,一个链表的长度超过8的时候就会转化为红黑树存储,由于红黑树的查询时间复杂度是O(logn),相较于JDK1.7版本可以提高查询性能,但是当元素的数量小于6的时候,又会转化为链表存储。1.JDK1.7版本中,HashMap采用数组+链表的数据结构,通过哈希算法将元素的键映射到数组的槽位中,如果多个键映射到同一个槽位,那么它们将以链表的形式存储在同一个槽位上。

2025-09-19 14:56:01 152

原创 CAS相关知识

使用AtomicStampedReference来解决这个问题,它加了预期标志和更新标志两个字段,更新的时候不光检查值,还要检查当前标志是否等于预期标志,全部相等才会更新。在CAS更新的过程中,当读取到的值是A,然后在准备赋值的时候仍然是A,但是实际可能是A的值被修改为B,然后又被修改成了A,造成了更新漏洞。:由 CPU 硬件指令保证,整个 “比较 + 更新” 过程不会被中断,不存在线程安全问题;2.循环时间长开销大,自旋CAS的方式如果长时间不成功,会占用大量CPU资源。

2025-09-19 10:20:18 465

原创 Volatile读写屏障插入策略

可见性:StoreLoad屏障确保volatile写的结果被后续读操作可见;LoadLoad屏障确保读操作能获取主内存最新值。禁止重排序:四类屏障从 “写前、写后、读前、读后” 四个维度限制了指令重排序,保证volatile变量的操作顺序与代码逻辑一致。

2025-09-10 15:39:29 451

原创 Volatile四大内存屏障

JVM 会在volatile变量的读写操作前后插入特定的内存屏障(Memory Barrier),限制指令重排序并保证内存可见性。

2025-09-10 15:33:44 531

原创 并发事务可能引发的 3 类数据一致性问题

【代码】并发事务可能引发的 3 类数据一致性问题。

2025-09-10 15:25:35 446

原创 Java的内存模型JMM的三大特性

两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。指程序执行的顺序按照代码的逻辑顺序执行。如果一个操作先行发生另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。指一个操作或多个操作要么全部执行完成,要么都不执行,中间不会被其他线程打断,操作过程不可分割。

2025-09-10 10:53:22 462

原创 三种让线程等待和唤醒的方法

【代码】三种让线程等待和唤醒的方法。

2025-09-10 10:23:58 129

原创 怎么停止中断一个运行中的线程?

【代码】怎么停止中断一个运行中的线程?

2025-09-10 10:15:49 158

原创 String、StringBuffer和StringBuilder的区别

在 Java 中,String和都是用于处理字符串的类,但它们在和上有显著区别,适用场景也不同。

2025-09-05 09:46:13 140

原创 Java面向对象的特点(封装、继承、多态)

当多个类中存在相同的属性和行为时,将这些内容提取到单独的一个类中,其他类无需再定义这些内容,只需要和抽取出来的类形成继承关系,也就是子类重用父类代码。将数据和方法封装在对象的内部,隐藏对象内部的实现细节,只暴露必要的接口供外部访问,通过封装可以实现信息的隐藏和保护,提高代码的安全性和可靠性。允许不同类的对象对同一消息作出响应,也就是同一消息可以根据发送对象的不同采用不同的行为方式。

2025-09-05 09:32:40 135

原创 类加载的过程(5部分)

通过类的包名+类名,获取到这个类的字节码文件的二进制字节流,将二进制字节流所代表的静态存储结构,转化为方法运行时的数据结构,在内存中生成一个代表该类的类对象,作为方法区该类各种数据的访问入口。(1)验证:确保字节码文件中字节流包含的信息符合当前虚拟机的要求,保证这个被加载类的正确不会危害到虚拟机的安全。(3)解析:Java虚拟机将常量池中的符号引用替换为直接引用。(2)准备:为类中的静态字段分配内存,并设置默认的初始值。(3)类对应的类对象没有任何地方被引用;执行类中的编译器自动生成的构造方法。

2025-09-04 15:08:57 122

原创 Redis分布式锁

在任务执行的过程中watchDog每隔10s会定期去检查任务的状态,如果任务未完成就会自动续约(30s)锁的过期时间,直到任务完成并手动释放锁。该机制可以确保即使任务的执行时间超过了最初锁的过期时间,锁仍然不会被其他线程抢占。(1)原理:利用set nx ex 获取锁,设置过期时间,并保存线程标识;释放锁时先判断线程标识是否与自己的一致,一致则删除锁。(1)原理:利用多个独立的Redis节点,必须所有节点都获取重入锁,才算获取锁成功。(2)缺陷:不可重入,无法重试,锁超时失效。利用信号量控制锁的重试等待;

2025-09-04 14:35:54 180

原创 RabbitMQ相关知识

RabbitMQ是一个消息中间件,进行消息的传输和交互,主要用于解决分布式系统中等问题。

2025-09-03 15:34:20 777

原创 双亲委派模型

(Parent Delegation Model)是 Java 虚拟机(JVM)中类加载机制的核心原则,用于规范类加载器如何加载类,确保类加载的安全性和一致性。

2025-08-07 15:24:59 242

原创 Java的异常体系

Java 的异常体系是基于类继承结构设计的,核心是类,它是所有错误(Error)和异常(Exception)的根父类。和,二者分别代表不同类型的程序问题。

2025-08-07 15:03:09 388

原创 常见线程池类型

【代码】常见线程池类型。

2025-08-06 17:00:19 271

原创 线程池的七大参数

那么就会创建一个新线程来执行这个任务,否则就会将这个任务加入到阻塞队列,然后从阻塞队列的头部取出一个任务执行,再将新任务加入到阻塞队列的末尾;:当添加失败时,主线程会自己调用执行器中的execute()方法来执行这个被拒绝的任务,但是如果此时线程池已经关闭,那么这个任务就会被丢弃。当一个任务提交到线程池,如果此时线程池中有空闲线程就会直接执行这个任务,如果此时线程池中没有空闲线程并且线程池中线程的数量小于。当线程池中没有空闲线程去执行新任务的时候,这个任务就会被加入到该队列中等待执行。

2025-08-06 16:54:19 396

原创 Redis为什么快?

内核会一直监听这些Socket上的连接请求和数据请求,一旦有请求到达,就会交给Redis的线程处理,实现一个Redis线程处理多个I/O流的效果。(1)Redis大部分的操作都是在内存中完成的,并且采用了String、List、Hash、Set、ZSet等高效的数据结构,因此当Redis出现瓶颈的时候,可能是机器内存或网络带宽造成的,而不是CPU,所以就可以采用单线程的解决方案。(2)Redis采用了单线程模型,可以避免多线程之间的竞争,省去了多线程切换所带来的时间和性能上的开销,而且也不会导致死锁问题。

2025-08-04 17:04:29 272

原创 Centos7安装Docker

3. 配置 Docker 仓库。4. 安装 Docker。5. 启动并设置开机自启。6. 配置镜像加速器。

2025-08-04 10:29:00 275

原创 MYSQL有哪些日志?

用于InnoDB存储引擎的崩溃恢复,当系统奔溃时,脏页数据还未持久化,但是redo log 已经持久化,MySQL奔溃重启后,可根据redo log的内容将数据恢复到最新的状态。记录所有对数据的更改操作的日志,它包含了对数据库进行插入、更新和删除操作的详细信息,已二进制的形式记录的,可以用于数据的备份、恢复和主从复制等场景。实现了事务的原子性,记录事务对数据的修改操作,方便在事务失败或回滚时恢复数据到事务之前的状态,确保事务的一致性。

2025-07-24 09:00:00 195

原创 CAP理论/BASE理论/ACID理论

摘要:CAP理论指出分布式系统中一致性(C)、可用性(A)和分区容错性(P)三者不可兼得;BASE理论基于CAP提出基本可用(BA)、软状态(S)和最终一致性(E)的折中方案;ACID理论则规定了事务的原子性(A)、一致性(C)、隔离性(I)和持久性(D)四大特性。三者共同构成了分布式系统设计的理论基础,CAP侧重系统特性权衡,BASE强调最终一致性,ACID保证事务可靠性。(149字)

2025-07-23 09:00:00 335

原创 Java创建对象的方式

Java创建对象主要有四种方式:1)使用new关键字直接调用构造方法;2)通过反射机制(Class.newInstance或Constructor.newInstance);3)实现Cloneable接口后使用clone()方法克隆对象;4)实现Serializable接口后通过序列化/反序列化机制创建对象。每种方式适用于不同场景,new最常用,反射适合动态创建,克隆和序列化用于复制对象。示例代码展示了各种实现方式及其注意事项。

2025-07-22 09:29:38 147

原创 如何使用volatile和sychronized实现单例模式

【代码】如何使用volatile和sychronized实现单例模式。

2024-08-07 15:44:50 341

原创 TCP和UDP的区别?

udp是尽最大努力交付,不保证可靠交付数据,但是根据udp可以实现可靠的传输协议,比如QUIC协议。tcp的首部较长,在没有使用【选项】字段时是20字节,使用【选项】字段后会更长,开销较大;udp没有拥塞控制和流量控制机制,但是即使网络速度十分拥堵,也不会影响udp的传输效率。udp是一个包一个包的发送,是有边界的,但是存在乱序和丢包的风险。udp也是传输层协议,不需要建立连接,可以直接传输数据。tcp是流式传输,是没有边界的,但是可以保证顺序和可靠;udp的首部是8字节,并且是固定不变的,开销较小。

2024-08-02 17:56:49 536

原创 SpringBoot集成Minio

【代码】SpringBoot集成Minio。

2024-08-02 13:56:17 565

原创 批量导入数据并上传到Minio

【代码】批量导入数据并上传到Minio。

2024-08-02 13:37:48 372

原创 Redis中的热Key是什么?怎么解决?

(1)开启内存淘汰机制,并选择使用LRU算法淘汰掉内存中不经常使用的key,保证内存中存储的都是最热门的数据。(2)给热key设置过期时间,确保key在一段时间后会自动删除,不会长期占用内存。(3)对热点key进行分片,将数据分散存储在不同的节点上,减轻单个key的压力。

2024-08-01 13:44:05 406

原创 ConcurrentHashMap底层的数据结构以及怎么实现线程安全?

在JDK1.7中ConcurrentHashMap采用分段锁的技术将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中的一段数据时,其他段的数据也能被其他线程访问,能够实现真正的并发访问。如果不为空,则使用Synchronized加锁,只让一个线程操作,然后遍历桶中的数据,并替换或新增节点到桶中,最后再判断是否需要转化为红黑树,就能保证并发访问的线程安全。当链表的长度大于8,并且数组的长度大于64的时候,链表就会升级为红黑树结构。的数据结构,而数组又分为大数组。

2024-07-29 12:03:44 670

原创 Mybatis与Mybatis_Plus的区别

(2)Mybatis_Plus相比与Mybatis提供了很多额外的功能,例如像条件构造器、代码生成器、分页插件、JSON处理器、枚举处理器等实用组件,使得开发者可以轻松快速完成业务逻辑的开发。(2)Mybatis_Plus是在Mybatis框架上的封装,只做增强不做改变,增强简化后的API更加方便进行开发,并且在性能、效率、易用性方面都有一定优化。(1)Mybatis的编程风格更加传统,需要定义mapper.xml文件,并根据传入的参数使用相应的SQL查询语句,需要实现Mybatis提供的各种方法;

2024-07-23 17:48:20 1711

原创 final、finally、finalize的区别

被final修饰的类不能被继承;被final修饰的方法不能被重写,JVM会尝试将其内联以提高运行效率;被final修饰的变量不能被改变,如果修饰引用,那么表示引用不可变,引用指向的内容可变;被final修饰的常量,在编译阶段会被存入常量池。是Object类提供的一个方法,用于对象被垃圾收集之前的特定资源回收。由JVM进行调用,并不能确保何时会调用,也不能保证调用后一定有效。一般与try或try-catch连用,用于抛出异常,finally代码块内的语句无论是否发生异常都会执行,常用于一些流的关闭。

2024-06-28 14:08:29 317

原创 区分POJO、DTO、DO、VO、BO、PO、Entity

通常在后端不需要关心怎么从json转成java对象的,这个都是由一些成熟的框架帮你完成啦,比如spring框架;在前端,它的存在形式通常是js里面的对象(也可以简单理解成json),即通过ajax请求的那个数据体。这也是为什么把他画成横跨两层的原因。举个例子,xxxDTO,xxx为业务领域相关的名称。现在微服务盛行,服务和服务之间调用的传输对象能叫DTO吗?我的理解是看情况,DTO的一个隐含意义是要能够完整的表达一个业务模块的输出。如果服务和服务之间相对独立,那就可以叫DTO;

2024-06-11 08:54:12 1732

原创 两数之和(输入有序数组)

从数组中找出满足相加之和等于目标数。如果设这两个数分别是。的形式返回这两个整数的下标。以长度为 2 的整数数组。重复使用相同的元素。

2024-03-29 10:05:53 577 1

原创 判断子序列

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。

2024-03-29 07:52:40 247

原创 验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个。字母和数字都属于字母数字字符。

2024-03-28 22:28:17 287

空空如也

空空如也

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

TA关注的人

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