AQS AQS是什么?AQS全称为抽象队列同步器,是用来实现锁或者其它同步器组件的公共基础部分的抽象实现,是重量级基础框架及整个JuC体系的基石,主要用于解决锁分配给”谁”的问题 整体就是一个抽象的FIFO队列来完成资源获取线程的排队工作,并通过一个int类变量表示持有锁的状态 AQS的”产品” ReentrantLock CountDownLatch ReentrantReadWriteLock S 2023-08-11
CountDownLatch CountDownLatch概述用来进行线程同步协作,等待所有线程完成倒计时。 其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一 123456789101112131415161718192021222324public static void main(String[] args) throws InterruptedException 2023-07-31
ThreadLocal 先上几个常见面试题 ThreadLocal中ThreadLocalMap的数据结构和关系? ThreadLocal的key是弱引用,这是为什么? ThreadLocal内存泄漏问题你知道吗? ThreadLocal中最后为什么要加remove方法? …… 什么是ThreadLocalThreadLocal提供线程局部变量。这些变量与正常的变量不同,因为每一个线程在访问ThreadLocal实例的 2023-07-29
走入UnSafe UnsafeUnsafe 对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用,只能通过反射获得 1234567891011121314151617public class UnsafeAccessor { static Unsafe unsafe; static { try { Field theUnsafe = Unsaf 2023-07-25
CompetableFutrue FutrueFutrue接口定义了(FutrueTask)定义了操作异步任务执行一些方法,如获取异步任务的执行结果、取消任务的执行、判断任务是否取消、判断任务执行是否完毕等。 Future 类是异步思想的典型运用,主要用在一些需要执行耗时任务的场景,避免程序一直原地等待耗时任务执行完成,执行效率太低。具体来说是这样的:当我们执行某一耗时的任务时,可以将这个耗时任务交给一个子线程去异步执行,同时我们 2023-07-22
CAS CAS概述CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性。 它是非阻塞的且自身具有原子性,也就是说这玩意效率更高且通过硬件保证,说明这玩意更可靠。 CAS是一条CPU的原子指令(cmpxchg指令),不会造成所谓的数据不一致问题,Unsafe提供的CAS方法(如compareAndSwapXXX)底层实现即为CPU指令cmpxchg。 执行cmpxchg指令的时候,会判断 2023-06-12
Redis Redis持久化单机的Redis存在四大问题: Redis有两种持久化方案: RDB持久化 AOF持久化 RDBRDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。快照文件称为RDB文件,默认是保存在当前运行目录。 RDB 2023-05-30
常用数据结构 红黑树(平衡二叉查找树)首先他是一棵二叉搜索树(左子节点的值小于自身,右子结点的值大于自身,左子树都小于自身,右子树都大于自身,中序遍历是递增有序的) 极端情况下退化为链表,此时高度为n,操作时间复杂读降低。所以需要平衡树 红黑树通过对结点进行黑红标色,旋转及其他操作进行平衡操作 红黑树不具有严格的平衡属性(平衡属性:任意结点左右子树高度相差不大于1),但是平均使用性能非常良好。适用于频繁插入 2023-05-08
Java8新特性 Lambda表达式Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁,灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。 Lambda表达式的格式1.标准格式: (参数列表) -> {代码} 2.格式说明: - 小括内的语法与传统方法参数列表一致,没有参数就留空,有多 2023-04-26
MySQL 多表查询概述如果设计到多表查询,那么首先应该确定设计哪几张表,然后分析他们之间的连接条件,最后确定查询字段。 多表查询就是指从多张表中查询数据。 原来查询单表数据,执行的SQL形式为:select * from emp; 那么我们要执行多表查询,就只需要使用逗号分隔多张表即可,如: select * from emp(17条记录) , dept(6条记录) ; 此时,我们看到查询结果中包含了大量的 2023-04-13