自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

落日的博客

记录分享学习过程

  • 博客(394)
  • 资源 (2)
  • 收藏
  • 关注

原创 SQL深分页的建议优化方案

假如有 t_order表 数据量有1000w,现在想分页查询第80w页的数据,每页10条,最基本的sql如下上面查询的问题在于,MySQL 必须扫描前 7999999 行(注意这里应该是 7999999,因为 LIMIT 子句中的偏移量是基于 0 的索引,但实际上它包括了这一行)来定位到第 7999990 行之后的 10 行数据。这种全表扫描(或至少是大部分表的扫描)在大数据集上是非常耗时的。

2024-09-05 22:21:46 428

原创 Web服务端通过SSE推送消息给浏览器客户端的实现方案(附详细代码和仓库地址)

目录1、SSE(Server-Sent Events)简介2、SSE 的工作原理3、SSE 与客户端轮询的区别和优势比较区别优势4、SSE简单实现(单机应用Demo)演示效果SSE-Demo仓库地址下面直接贴代码:前端实现:后端实现:5、SSE简单实现(分布式应用Demo)SSE-Demo仓库地址关键代码方案说明1、SSE(Server-Sent Events)简介Server-Sent Events (SSE) 是一种基于 HTTP 协议的服务器推送技术,允许服务器通过单个持久连接向客户端发送实时更新

2024-09-01 13:03:52 1028

原创 Mybatis的XML文件中<if>标签内的判断语句equals的坑

可能是因为OGNL对单字符的识别 当成了char类型 ,而我们代码中是String类型,所以判断成了false。所以在Mybatis的XML文件中判断字符串是否相等,建议使用。假如代码中 String name = “B”;即单引号内包双引号的方式。

2024-08-31 20:18:34 460

原创 Oracle数据库大小写问题注意点

在 SQL 查询中使用双引号包裹列名时,Oracle 才会按照你指定的大小写返回列名。否则默认返回的是全大写列名。

2024-08-31 20:04:25 114

原创 MySQL数据误删或者误更新如何恢复(详细步骤,一看就会)

①、测试环境少量近期误删除或者误更新的数据恢复。②、测试环境少量从库数据不一致问题。备注:大量数据的恢复或者复制还是需要使用备份数据,例如使用mysqldump或者Mydumper、mysqlshell。(本篇文章对此不做讨论)警告:数据恢复为DBA专业人员负责处理的事情,本文章仅为开发人员测试环境恢复近期误操作的少量数据提供参考。请对生产环境数据心存敬畏~

2024-08-19 14:36:26 2043

原创 CompletableFuture详解+实战

是 Java 8 引入的一个用于异步编程的类。在出现之前,我们可以使用线程池配合Future来处理异步任务。但是线程池的异步操作功能难以编写复杂异步操作的组合和控制。所以JDK8推出了,它允许我们编写非阻塞的代码,并提供了一种简洁的方式来处理异步任务和并发操作,支持多种异步操作的组合和控制。默认情况下,使用公共的作为线程池。这个线程池是全局共享的,如果过多异步任务占用这个线程池会导致资源紧张,也不利于线程管理。建议使用方法,将自定义的Executor传递给。

2024-08-10 17:28:26 982

原创 FutureTask详解

接口功能描述主要方法/特点适用场景Runnable定义要执行的任务,无返回值run()用于执行不需要结果的任务,如线程的任务Callable定义要执行的任务,有返回值,并可能抛出异常call()用于执行有返回值的任务Future管理异步计算的结果,检查状态和处理异常get()cancel()isDone()用于管理异步任务的结果和状态结合Runnable和Future的功能,可以执行任务并管理结果继承Runnable和Future用于需要同时支持Runnable和Future功能的场景,如。

2024-08-05 22:50:58 1299

原创 Java线程池原理剖析和应用指南

目录Java线程池详解一、Java线程池简介池化思想池化思想的优点二、线程池的实现原理分析实现线程池需要考虑哪些问题?线程池的简单使用示例线程池原理的简单图示三、Executor详解Executor简介Executor框架的继承结构总结ExecutorExecutorService四、ThreadPoolExecutor 详解线程池的七个参数线程池的任务调度流程图示WorkThread模式和Future模式线程池的状态和内部结构线程池的关闭线程池的状态转换图工作线程`Worker``execute`方法详解

2024-08-04 11:22:41 1054

原创 StampedLock详解

是JUC并发包里面 JDK8 版本新增的一个锁,是读写锁的一种具体实现,和不同的是其不提供可重入性,不基于某个类似Lock或者ReadWriteLock接口实现,而是基于CLH锁思想实现这点这AQS有些类似,并且StampedLock不支持条件变量Condition。关于可以参考上篇文章 ReentrantReadWriteLock详解。那么JDK既然实现了这个锁,就说明这个锁一定有优势,那就是性能优势,下面会具体分析。

2024-07-28 17:38:56 1358

原创 ReentrantReadWriteLock详解

ReentrantReadWriteLock 只是读写锁思想的一个具体Java实现。重要的是理解这种思想。掌握这些思想可以帮助我们在不同编程语言或框架中应用类似的锁机制。《图解Java多线程设计模式》《Java并发编程的艺术》

2024-07-27 15:32:00 802

原创 Java锁详解(包含Lock接口ReentrantLock详解)

首先非公平是说先尝试获取锁的线程并不一定比后尝试获取锁的线程优先获取锁。

2024-07-24 17:30:28 822

原创 ThreadLocal详解

get() 方法首先获取当前线程,然后尝试从当前线程的 ThreadLocalMap 中获取与当前 ThreadLocal 实例关联的值。如果找到了该值,则直接返回;否则调用 setInitialValue() 设置并返回初始值。getMap(Thread t) 方法返回当前线程的 ThreadLocalMap。> key) 方法通过计算哈希值获取与 key 关联的条目,如果没有找到,则调用 getEntryAfterMiss 继续查找。

2024-07-23 18:07:41 1928

原创 JUC包下的并发工具类

并发工具类主要功能用法示例特点与注意事项CountDownLatch (倒计数器)允许一个或多个线程等待其他线程完成操作后再继续执行- 只能使用一次,不能重置 - 适用于一次性事件,例如等待多线程计算完成后汇总结果CyclicBarrier (循环屏障)使一组线程到达一个屏障点时被阻塞,直到最后一个线程到达屏障点,所有线程才继续执行- 可以重用,适用于多次执行的场景- 适用于需要多个线程同时开始某些任务的场景,例如多线程处理数据后同时汇总Semaphore (信号量)

2024-07-23 09:35:23 955

原创 Java CAS、Unsafe类、原子类详解

CAS(Compare-And-Swap),直译为比较交换。CAS是一种用于多线程编程的原子操作。主要用于无锁算法和无锁数据结构的实现。Unsafe类在之前AQS详解和LockSupport详解中都有提到。Unsafe听名字就知道这个类不安全,它是Java平台提供的一个内部类,位于sun.misc包下,它允许Java代码直接访问和操作底层内存,执行一些通常被认为是不安全的操作。

2024-07-22 10:31:30 1039

原创 LockSupport详解

LockSupport 是 Java 并发包(java.util.concurrent)中的一个工具类,提供了基本的线程阻塞和唤醒机制。它主要用于实现锁和其他同步类,如AQS、 ReentrantLock、Semaphore、CountDownLatch 等。LockSupport 提供的主要方法是park和unpark,它们分别用于挂起和唤醒线程(会让线程进入WATING状态)。AQS中对线程进行挂起和唤醒操作最终使用的就是和。AQS相关内容可以参考 我的上一篇博客AQS详解。

2024-07-18 22:24:43 869

原创 AQS详解(详细图文)

至此大概能够了解到AQS内部的一些实现了,Node类用于在AQS的同步队列和条件队列中维护线程的等待状态和链表结构。通过waitStatus字段和链表结构,AQS能够有效管理线程的阻塞、唤醒和取消操作,保证并发环境下的线程同步。之前在synchronized关键字详解这篇文章中有说过锁的本质。实际上无论是锁还是别的什么同步器,比如JVM对应synchronized底层锁的实现、亦或是AQS及其子类,它们实现的思想都差不多。

2024-07-17 23:49:55 640

原创 final关键字详解

This逃逸(This Escape)是指在对象的构造过程中,this引用被暴露到构造函数外部的情况。这种暴露可能会导致未完全构造的对象被其他线程访问,从而引发不确定的行为和潜在的并发问题。

2024-07-13 17:16:45 644

原创 synchronized关键字详解(全面分析)

synchronized 直译为 同步,它的作用是实现线程同步, synchronized 能够确保同一时刻只有一个线程可以执行某个代码块或方法,我们可以把共享变量的修改放在synchronized 修饰的代码块中或者方法中,从而避免多个线程同时访问共享资源时引发的线程安全问题。①、synchronized关键字用在代码块上,锁是synchonized括号里配置的对象,可以实现类级别的同步(使用类的Class对象作为锁,或者使用静态实例变量作为锁)。也可以实现对象级别的同步(使用类的实例变量作为锁)。

2024-07-11 23:19:16 1001

原创 Java中volatile关键字详解(详细图文)

经过上面那么多的铺垫,我们再来总结下,整体思路就非常清晰了。JVM中通过下面这四个函数来实现编译器屏障和 CPU指令(硬件)屏障volatilevolatile 关键字保证有序性的原理:JVM通过JMM(Java内存模型)规范定义volatile关键字保证有序性,主要是通过内存屏障机制(包括编译器屏障,CPU指令屏障)来确保编译器生成的汇编代码保持程序员期望的执行顺序,并且确保处理器(CPU)按照顺序执行指令。

2024-07-05 17:54:33 1505

原创 增加Github访问稳定性

官方下载和使用地址:https://www.dogfight360.com/blog/686/#google_vignette

2024-07-03 09:47:35 337 1

原创 JMM(Java内存模型)详解

为了对上面的问题进行更深入的探究,我有查了一些JIT相关的资料。简单总结下JIT然后再对上面的问题分析下。JIT(Just-In-Time)编译器是Java虚拟机(JVM)中的一个关键组件,它负责在程序运行过程中动态地将字节码(即Java编译后的.class文件中的代码)转换为特定于平台的机器代码。这一过程旨在提高程序的执行效率,因为它能够针对运行时的数据和实际使用模式进行优化,而不仅仅是基于静态代码分析。JIT工作原理加载与解释执行:当Java程序启动时,JVM首先加载类文件并由解释器执行字节码。

2024-07-03 09:21:13 2761

原创 Java并发编程基础知识点

start当两个或多个线程互相等待对方释放资源时,就会发生死锁。例如:有两只狗秀逗和四眼,秀逗和它的好兄弟四眼都着急上厕所,假设上厕所需要拿到厕所钥匙和手纸,此时秀逗抢到了钥匙,四眼抢到了手纸。它俩谁也不让谁,秀逗拿着钥匙等待四眼给它手纸,四眼拿着手纸等秀逗给它钥匙。等着等着,两只狗都崩裤兜里了。。。这就是出现了线程死锁,反应到计算机上,可能的问题就是导致线程无法继续往下运行,还会导致计算机资源无法释放,系统可用资源逐渐减少,最终可能导致系统资源耗尽。参与死锁的线程无法继续执行,造成这些线程的永久阻塞。

2024-06-30 22:18:29 987

原创 Java注解

下面的例子是使用代理+注解实现对方法入参的非空校验});i ++) {throw new RuntimeException("方法:" + method . getName() + "的参数" + parameters [ i ] . getName() + " 不能为空!");i ++) {

2024-06-28 16:56:15 919

原创 Java的反射机制

JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取类的信息以及动态调用对象的方法的功能称为 java 语言的反射机制。

2024-06-28 16:50:49 697

原创 Java网络编程

Java中的Socket编程涉及两种基本类型:服务器Socket(ServerSocket)和客户端Socket(Socket)。服务器Socket用于服务器端,监听客户端的连接请求并接受连接,而客户端Socket用于客户端,发起连接并与服务器通信。Java的Socket是Java语言提供的一种用于网络通信的机制。Socket允许客户端和服务器之间建立连接,并在连接上进行数据传输。这个工具类似于 linux系统上的 telnet工具 可以帮助我们在Windows系统上检测 远程端口的连通性。

2024-06-28 16:49:58 505

原创 Java的NIO体系

在传统的数据处理流程中,数据从一个位置(如磁盘)读取到操作系统内核缓冲区,再从内核缓冲区复制到用户空间的应用程序缓冲区,然后在某些场景下(如网络传输),数据可能还需要从用户空间复制回内核空间的网络缓冲区以便发送。它可以将一个文件或者文件的一部分映射到内存中,形成一个虚拟内存文件,这样就可以直接操作内存中的数据,而不需要通过系统调用来读写文件。Selector 能够同时监听多个通道,当任何一个通道上发生感兴趣的事件时,Selector 都能及时地通知程序,因此能够有效地实现多路复用,提高系统的并发处理能力。

2024-06-28 16:49:09 1151

原创 Java的IO体系

而编码和解码转换之间是需要遵循规则的,即编码和解码都遵循同一种规则才能将文字信息正常显示,如果编码跟解码使用了不同的规则,就会出现乱码的情况。这意味着在使用"rws"模式打开文件时,不仅对文件内容的更新会被立即写入,还包括文件的元数据,比如文件属性、修改时间等。不同的是,"rwd"模式只要求对文件内容的更新被立即写入,而元数据可能会被延迟写入,这意味着文件的属性信息等可能不会立即更新到磁盘。它们分别属于不同的编码集。文件内容通常指的是文件中存储的实际数据,即由应用程序创建的、用户需要读取或操作的数据。

2024-06-28 16:47:42 685

原创 Java的泛型机制

Java 泛型(Generics) 是 JDK 5 中引入的一个新特性。泛型是一种参数化类型的机制,它允许在定义类、接口和方法时使用类型参数。通过泛型,可以编写与特定类型无关的代码,使得代码具有更广泛的适用性和重用性。具体体现在以下方面类型安全:泛型通过在编译时进行类型检查,可以在编译阶段发现类型不匹配的问题,减少了运行时出现类型转换异常的可能性,提高了程序的健壮性。代码重用:通过使用泛型,可以编写更加通用的算法和数据结构,使得它们可以适应不同的数据类型,从而提高了代码的重用性。

2024-06-28 16:46:17 338

原创 Java的异常处理体系

ControllerAdvice 注解用于定义全局控制器建议,在 Spring MVC 中,控制器建议由控制器中的 @ExceptionHandler 方法、@InitBinder 方法和 @ModelAttribute 方法组成。①、CheckedException (检查异常 必须在代码中显式处理 使用try catch捕获 或者 在方法上使用 throws 抛出 除了RuntimeException及其子类以外,其他的Exception类及其子类都属于受检查异常 )

2024-06-28 16:42:10 1310

原创 Java基础知识点

面向对象是一种思想,能让复杂问题简单化,面向对象思想程序员不需要了解具体的实现过程,只需要使用特定对象去实现功能即可。面向对象的底层其实还是面向过程,把面向过程抽象成类,然后进行封装,方便我们使用。面向对象是相对面向过程而言,面向对象和面向过程都是一种思想。面向对象是基于面向过程的。面向过程强调的是功能、行为。面向对象:将功能封装进对象,强调具备了功能的对象本身。JDK(Java Development Kit)是Java程序开发工具包,包含JRE和开发人员使用的工具。

2024-06-28 16:40:25 871

原创 ConcurrentLinkedQueue详解(详细图文+动画演示)

ConcurrentLinkedQueue 是 Java 中 java.util.concurrent 包下的一个非阻塞线程安全队列实现。为什么要详细讲这个队列呢?主要还是因为这个队列的高并发,无锁等特性。同时这个队列总结完之后,就开始进入Java并发相关的内容总结了。ConcurrentLinkedQueue 的一些关键特性:①、 非阻塞算法。

2024-06-28 12:09:23 1824

原创 DelayQueue详解

DelayQueue 也是 Java 并发包()中的一个特殊队列,用于在指定的延迟时间之后处理元素。

2024-06-25 11:29:32 1690

原创 PriorityQueue详解(含动画演示)

完全二叉树:强调树的形态,所有节点从左到右依次填满。大顶堆和小顶堆:不仅是完全二叉树,还在此基础上增加了节点值的排序要求,确保堆顶元素是最大值(大顶堆)或最小值(小顶堆)。

2024-06-23 19:11:39 1526

原创 BlockingQueue详解(含动画演示)

①、在队列为空时,获取元素的操作将会被阻塞,直到队列变为非空。②、在队列已满时,插入元素的操作将会被阻塞,直到队列不再是满的。阻塞队列是线程安全的,且通常用于生产者-消费者模型中。BlockingQueue 提供了四种不同类型的操作方式:抛出异常、特殊值、阻塞和超时。ArrayBlockingQueue 下面会详细讲解。LinkedBlockingQueue 讲解一下底层数据结构和 take、put方法。PriorityBlockingQueue 简单介绍。

2024-06-22 10:05:55 759

原创 ArrayDeque详解(含动画演示)

当tail默认是0开始的时候,开始的时候,直接添加元素到数组的第一个位置,然后再计算tail(此时计算的位置是下一次要添加到位列末尾的位置),tail = (0+ 1) & (8 - 1) = 1,也就是第二次要添加到队列末尾的元素放在数组的第二个位置。元素从队尾(rear)加入,从队头(front)移除。开始的时候,先减一,再和数组长度减一求与,这个操作就相当于,head下标和数组长度求余,再往左移动一位。下面这段代码的核心是将现有的元素复制到一个新的更大的数组中,以便有足够的空间添加新的元素。

2024-06-20 11:05:18 1250 1

原创 ConcurrentHashMap详解

ConcurrentHashMap是线程安全的键值对集合。ConcurrentHashMap的设计宗旨是减少锁的竞争,来提高并发性能。ConcurrentHashMap 非常适用于需要高并发读写的场景,下面是几个常见的使用场景:缓存系统:在一个多线程环境中使用缓存时,ConcurrentHashMap 能有效地处理大量的并发读写请求,保证数据的一致性和访问速度。计数器:在高并发的应用中,例如统计网站访问量、计数器等,ConcurrentHashMap 可以高效地更新计数器值。

2024-06-19 14:22:48 1221 1

原创 LinkedHashMap详解

LinkedHashMap 是 HashMap 的子类,与 HashMap 类似,它也基于哈希表来存储键值对。但是,LinkedHashMap 维护了一个双向链表来记录插入顺序或者访问顺序,因此具备一些特有的特性和功能。双向链表在LinkedList详解这篇文章中有介绍。LinkedHashMap 中使用双向链表维护顺序的图示:绿色连线表示 双向链表的 pre和next指针。

2024-06-17 11:17:53 429

原创 HashMap详解(含动画演示)

/ 加载因子,用于控制哈希表的扩容频率// 默认的加载因子// 哈希表的最大容量 2的30次方 1,073,741,824 10亿多// 扩容阈值,当哈希表中元素个数超过这个值时,会触发扩容/*** 有参构造函数1:只接受初始容量参数* @param initialCapacity 初始容量*/// 调用另一个构造函数,使用默认加载因子/*** 有参构造函数2:接受初始容量和加载因子参数* @param initialCapacity 初始容量。

2024-06-15 11:53:54 1472 2

原创 Stack详解(含动画演示)

上面我们自己利用Object 数组和Arrays.copyOf方法实现了简单的栈,我们默认设置了10的容量,如果超过10个元素,我们利用Arrays.copyOf完成数组的复制。我们利用Object 数组和Arrays.copyOf方法实现了一个简单的栈,这个栈包含基本的 push、peek、pop、size、isEmpty方法,并模拟出栈顺序重写了 toString。Stack通过操作数组的末尾,比如push只把元素添加到数组的末尾,pop只移除数组末尾的元素。它直接访问 Vector 的最后一个元素。

2024-06-12 14:42:21 841

原创 CopyOnWriteArrayList详解

我第一次听说这个集合还是看了一个博客 说这个集合叫Cow 奶牛集合。然后就记住了哈哈。。。CopyOnWriteArrayList 是 List 接口的一个线程安全实现,适用于需要保证线程安全频繁读取和偶尔修改的场景。其基本工作原理是,当对列表进行写操作(如添加、删除、更新元素)时,它会创建一个底层数组的副本,然后在新数组上执行写操作。这种“写时复制”的机制确保了在进行写操作时,不会影响正在进行的读操作,从而实现了线程安全。所以"COW" 是 “写时复制”。

2024-06-09 21:21:13 2219 1

Linux环境安装JDK8 版本至8u202步骤,包含jdk-8u202-linux-x64.tar.gz压缩包 和安装步骤

jdk-8u202-linux-x64.tar.gz 为Oracle提供的java8版本最后一个免费商用版 Linux环境安装JDK8 版本至8u202步骤,包含jdk-8u202-linux-x64.tar.gz压缩包 和安装步骤

2022-03-08

安卓侧滑菜单+圆形裁切头像+6.0权限申请+7.0 file provider+sharedpreference保存头像到本地

安卓ui框架,侧滑菜单+TabLayout+ViewPager+圆形头像裁剪+拍照相册裁切头像+6.0动态权限申请+7.0 file provider+sharedpreference保存头像到本地 里面还有自定义toast 点击两次退出程序等实用方法 欢迎下载学习 DEMO内代码注释详细 看了就懂

2018-09-29

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

TA关注的人

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