自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

落日的博客

记录分享学习过程

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

原创 ReentrantReadWriteLock详解

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

2024-07-27 15:32:00 532

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

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

2024-07-24 17:30:28 594

原创 ThreadLocal详解

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

2024-07-23 18:07:41 1141

原创 JUC包下的并发工具类

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

2024-07-23 09:35:23 883

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

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

2024-07-22 10:31:30 960

原创 LockSupport详解

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

2024-07-18 22:24:43 618

原创 AQS详解(详细图文)

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

2024-07-17 23:49:55 340

原创 final关键字详解

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

2024-07-13 17:16:45 583

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

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

2024-07-11 23:19:16 786

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

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

2024-07-05 17:54:33 770

原创 增加Github访问稳定性

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

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

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

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

2024-07-03 09:21:13 853

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

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

2024-06-30 22:18:29 904

原创 Java注解

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

2024-06-28 16:56:15 894

原创 Java的反射机制

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

2024-06-28 16:50:49 662

原创 Java网络编程

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

2024-06-28 16:49:58 458

原创 Java的NIO体系

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

2024-06-28 16:49:09 1113

原创 Java的IO体系

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

2024-06-28 16:47:42 625

原创 Java的泛型机制

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

2024-06-28 16:46:17 317

原创 Java的异常处理体系

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

2024-06-28 16:42:10 1289

原创 Java基础知识点

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

2024-06-28 16:40:25 826

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

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

2024-06-28 12:09:23 1403

原创 DelayQueue详解

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

2024-06-25 11:29:32 1073

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

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

2024-06-23 19:11:39 994

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

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

2024-06-22 10:05:55 686

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

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

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

原创 ConcurrentHashMap详解

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

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

原创 LinkedHashMap详解

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

2024-06-17 11:17:53 369

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

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

2024-06-15 11:53:54 1174 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 790

原创 CopyOnWriteArrayList详解

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

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

原创 LinkedList详解(含数据结构动画演示)

/ 获取链表的最后一个节点,赋值给变量 l// 如果链表为空,即最后一个节点为 null,抛出 NoSuchElementException 异常// 调用 unlinkLast 方法,从链表中移除最后一个节点// 确保 l 是最后一个节点且不为 null 的断言,注释掉的是因为在实际代码中没有执行断言检查的需要= null;// 保存最后一个节点的值// 保存最后一个节点的前一个节点// 将最后一个节点的值设为 null,帮助垃圾回收。

2024-06-07 14:54:03 1044

原创 ArrayList详解

基于JDK8。

2024-06-05 23:27:24 713

原创 谈谈JDK 漏洞 6260652

在看ArrayList源码的过程中 发现带参构造里有一个注释:于是带着下面三个问题去查资料,探究了一下这个问题。

2024-06-05 10:36:57 1014

原创 Java集合基础知识点系统性总结篇

特性ComparableComparator所在包java.langjava.util比较方法是否需要修改类需要修改比较的类本身不修改比较的类,通常在外部定义适用场景类需要有固定的排序方式时类不修改自身排序逻辑的情况时,使用比较灵活dogs . add(new Dog("四眼" , 4 , "吃馒头喝稀饭"));dogs . add(new Dog("秀逗" , 8 , "吃骨头"));dogs . add(new Dog("大黄" , 5 , "吃烤鸭屁股"));

2024-06-03 22:51:17 964

原创 图文并茂带你理解Java的代理模式

代理模式( Proxy ),给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通常会通过代理对象来为原对象添加额外的功能。代理模式属于结构型模式主要用于处理类或对象的组合。上面是比较正式的书面释义,举个通俗点的例子来帮助理解:周末你躺在床上饿了想吃火鸡面,但是你有点懒,你找你女朋友帮你泡好并端到你面前喂你吃,最后你把火鸡面吃完了,说了句宝宝你真好~这个例子中:你吃了一包火鸡面,是你做的动作。

2024-06-01 17:06:06 956

原创 JDK版本特性(JDK8\11\17\21版本)

Oracle官网中JDK版本的说明,Java SE 8、11、17和21是LTS版本。也就是长期支持版本。我们针对这几个版本了解学习下对应版本的新特性。

2024-06-01 16:37:49 1172

原创 MySQL排序字段无法唯一标识一条数据,导致分页查询结果出现重复或遗漏问题

目前最可能的推测就是在排序时 product_hierarchy 和 material_no 无法唯一标识一条数据,同时InnoDB 引擎在使用隐式主键来确保排序的一致性时也出现了问题(至于具体到底是哪里出了问题暂时还没找到),导致分页出现了重复数据,即排序出现了不稳定的情况。这种情况危害性比较大,会导致排序结果的混乱,不同页面分页数据的重复,查询和导出的数据顺序不一致,如果前端页面使用重复的id作为DOM元素的key,重复数据量过大时还可能导致前端页面的假死等更严重的情况。在排序字段不是唯一的情况下。

2024-05-31 11:00:55 533

原创 Java API使用避坑合集

相当于避坑大杂烩、会涉及各种坑,持续更新…

2024-05-25 21:31:55 407

原创 Java开发工具类(JDK、Hutool、Guava)

Guava提供了丰富的不可变集合(Immutable Collections)、多值映射(Multimap)、双向映射(BiMap)、表(Table)等数据结构,以及强大的集合操作工具类,如Iterables、Lists、Sets等,这些都大大增强了Java集合框架的功能。Guava的目标是提高Java程序员的生产力,特别是通过减少常见的编程任务中的 boilerplate code(样板代码),同时引入一些Java标准库中没有的功能和改进已有的功能。合理评估并选择真正能带来性能提升的数据进行缓存。

2024-05-23 18:06:05 1091

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关注的人

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