自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

wlcass zhengge blog

专精Java后端研发领域

  • 博客(90)
  • 问答 (3)
  • 收藏
  • 关注

原创 MySQL篇(窗口函数/公用表达式(CTE))

窗口函数是一种SQL函数,非常适合于数据分析,其最大的特点就是:输入值是从SELECT语句的结果集中的一行或者多行的"窗口"中获取的,也可以理解为窗口有大有小(行数有多有少)。通过OVER子句,窗口函数与其他的SQL函数有所区别,如果函数具有OVER子句,则它是窗口函数。如果它缺少了OVER子句,则他就是个普通的聚合函数。窗口函数可以简单地解释为类似于聚合函数的计算函数,但是通过GROUP BY子句组合的常规聚合会隐去正在聚合的各个行,最终输出称为一行。但是窗口函数聚合完之。

2024-09-17 16:59:25 1456

原创 MySQL篇(数值函数/)(持续更新迭代)

MySQL的常见函数我们学习完了,那接下来,我们就来分析一下,在前面讲到的两个函数的案例。返回x的反正弦值,即获取正弦为x的值。返回x的反余弦值,即获取余弦为x的值。返回0~1的随机值,其中x的值用作种子值,相同的X值会产生相同的随机数。返回一个对x的值进行四舍五入后最接近X的值,并保留到小数点后面Y位。返回以10为底的X的对数,当X <= 0 时,返回的结果为NULL。返回以e为底的X的对数,当X <= 0 时,返回的结果为NULL。返回以2为底的X的对数,当X <= 0 时,返回NULL。

2024-09-17 11:51:02 1212

原创 MySQL篇(高级字符串函数/正则表达式)(持续更新迭代)

MySQL中内置了很多字符串函数,常用的几个如下:注意:以下只列举了常用函数,其余查看官方文档MySQL :: MySQL 8.0 参考手册 :: 12.8 字符串函数和运算符MYSQL中的正则表达式,主要用于对文本串进行条件筛选的操作,比如筛选出串中某些带指定数字、符号、子串的部分。

2024-09-16 10:16:06 736

原创 MySQL篇(运算符)(持续更新迭代)

运算符连接表达式中各个操作数,其作用是用来指明对操作数所进行的运算。MySQL 支持 4 种运算符,分别是算术运算符、比较运算算术运算包括加、减、乘、除等。比较运算符包括大于、小于、等于或不等于。比较运算符用于数值的比较、字符串的匹配等方面。逻辑运算符包括与、或、非、异或等。逻辑运算符返回值为布尔型,真值(1 或 true)和假值(0 或 false)。位运算符包括按位与、按位或、按位取反、按位异或、按位左移和按位右移等位运算符。位运算先将数据转换为补码,然后在根据数据的补码进行操作。

2024-09-16 10:13:47 641

原创 MySQL篇(SQL - 分类)(持续更新迭代)

SQL主要分四类:DDL、DML、DCL、DQL数据定义语言,用来定义数据库对象(数据库,表, 字段)例如:创建(create),修改(alter),删除(drop)等2. DML语句数据操作语言,用来对数据库表中的数据进行增删改例如:增(insert),删(delete),改(update),查(select)因为查询语句使用的非常的频繁,所以很多人把查询语句单拎出来一类,3. DQL(Data Query Lanauage),DR(获取)数据查询语言,用来查询数据库中表的记录。

2024-09-15 19:50:02 1577

原创 MySQl篇(SQL - 基本介绍)(持续更新迭代)

1、SQL是结构化查询语言(Structure Query Language),专门用来操作/访问关系型数据库的通用语言虽然SQL定义了一套操作关系型数据库统一标准,但是不同数据库之间可能存在SQl方言2、SQL方言(或者数据库方言)指的是用于访问数据库的结构化查询语言的变体,根据具体的数据库系统不同,也可能会支持不同的方言,例如:MySQL、Oracle、PostgreSQL 分页查询之间存在SQL方言1、Oracle中使用ROWNUM或者ROW_NUMBER()函数实现限制检索行数和分页查询。

2024-09-15 19:48:29 1128

原创 MySQl篇(数据类型)(持续更新迭代)

VARBINARY (M)为可变长度的二进制字符串,M表示最多能存储的字节数,总字节数不能超过行的字节长度限制65535,在可视化工具中,在t_binary表中添加“政哥”时,utf-8编码处理,一个汉字 占 3 个字节,“政哥” 就有 6 个。YEAR还有格式为“YY”2位数字的形式,值是0069,表示20002069年,值是7099,表示19701999年,BLOB类型存储的是二进制字符串,TEXT类型存储的是文本字符串,BLOB类型还可以存储图片和声音等二进制数。

2024-09-15 19:45:28 1337

原创 MySQl篇(基本介绍)(持续更新迭代)

数据库就是用于存储和管理数据的仓库,英文:DataBase(简称:DB),而在数据库中的数据也是有组织的进行存储!关系型数据库指的是多张相互连接的二维表组成的数据库,所谓二维表指的就是由行和列组成的表,如下图(就类似于Excel表格数据,有表头、有列、有行, 还可以通过一列关联另外一个表格中的某一列数据)。还有MySQL、Oracle、DB2、SQLServer这些都属于关系型数据库,里面都是基于二维表存储数据的。

2024-09-15 19:42:28 2160

原创 多线程篇(笔试题)(持续更新迭代)

LeetCode上专门的多线程题目版块,本文通过解决几道leetCode上的多线程协作交替打印的编程题,来加深对并发编程的理解,并训练一下并发编程思想。

2024-09-14 17:55:39 1073

原创 多线程篇(面试题)(持续更新迭代)

CAS的全称是: Compare And Swap(比较再交换),它体现的一种乐观锁的思想,在无锁情况下保证线程操作共享数据的原子性。在JUC( java.util.concurrent )包下实现的很多类都用到了CAS操作AbstractQueuedSynchronizer(AQS框架)AtomicXXX类例子:我们还是基于刚才学习过的JMM内存模型进行说明线程1与线程2都从主内存中获取变量int a = 100,同时放到各个线程的工作内存中。

2024-09-14 17:49:26 1694

原创 多线程篇(线程池 - 整体介绍)(持续更新迭代)

在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将它们分配给可用的CPU。在上层,Java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器 (Executor框架)将这些任务映射为固定数量的线程;在底层,操作系统内核将这些线程映射到硬件处理器上。这种两级调度模型的示意图如图10-1所示。

2024-09-13 12:37:30 1138

原创 多线程篇(线程池- CPU密集型 & IO密集型任务)(持续更新迭代)

通常我们会开CPU核心数数倍的线程,在线程进行 I/O 操作 CPU 空闲时,启用其他线程继续使用 CPU,以提高 CPU 的使用率,充分利用。我们在选择线程池的时候,我们需要知道某一个任务是否是CPU消耗型的任务,还是说IO类型的任务,以便充分的调用CPU资源。我们需要知道某一个任务是否是CPU消耗型的任务(定容线程池),还是说IO类型的任务(缓存线程池),充分的调用CPU资源。I/O密集型相反,听名字就知道,系统运行多是CPU在等I/O (硬盘/内存) 的读写操作,此类情景下CPU负载并不高。

2024-09-13 12:35:54 899

原创 多线程篇(Fork/Join)(持续更新迭代)

Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。我们再通过Fork和Join这两个单词来理解一下Fork/Join框架。Fork就是把一个大任务切分为若干子任务并行的执行,Join就是合并这些子任务的执行结果,最后得到这个大任务的结果。比如计算1+2+…+10000,可以分割成10个子任务,每个子任务分别对1000个数进行求和, 最终汇总这10个子任务的结果。

2024-09-13 12:34:39 764

原创 多线程篇(其它容器- ConcurrentHashMap)(持续更新迭代)

ConcurrentHashMap 是线程安全并且高效的 HashMap。本节让我们一起研究下该容器是如何在 保证线程安全的同时又能保证高效的操作。

2024-09-12 21:04:29 1205

原创 多线程篇(其它容器- ConcurrentLinkedQueue)(持续更新迭代)

在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。本节让我们一起来研究一下DougLea是如何使用非阻塞的方式来实现线程安全队列ConcurrentLinkedQueue的,相信从大师身上我们能学到不少并发编程的技巧。

2024-09-12 21:03:49 929

原创 多线程篇(其它容器- ConcurrentSkipListMap)(持续更新迭代)

一个可伸缩的并发实现,这个map实现了排序功能,默认使用的是对象自身的compareTo方法,如果提供了比较器,使用比较器的比较方法。简单来说ConcurrentSkipListMap是TreeMap的并发实现,但是为什么没有称之为ConcurrentTreeMap呢?这和其自身的实现有关。该类是SkipLists的变种实现,提供了log(n)的时间开销:Insertion, removal, update, and access等操作都是线程安全的。迭代器是弱一致性的,升序迭代器比降序的快。

2024-09-12 21:02:44 769

原创 多线程篇(其它容器- ConcurrentSkipListSet)(持续更新迭代)

ConcurrentSkipListSet,是JUC新增的一个集合工具类,顾名思义,它是一种SET类型。SET类型,在数学上称为“集合”,具有互异性、无序性的特点,也就是说SET中的任意两个元素均不相同(即不包含重复元素),且元素是无序的。JDK提供的默认SET实现——HashSet,其实就是采用“组合”的方式——内部引用了一个HashMap对象,以此实现SET的功能。

2024-09-12 20:56:33 1082

原创 多线程篇(其它容器- CopyOnWriteArraySet)(持续更新迭代)

CopyOnWriteArraySet是线程安全的Set集合,相当于线程安全的HashSet。注意:HashSet的实现是通过散列表HashMap实现的,但是CopyOnWriteArraySet是通过动态数组CopyOnWriteArrayList实现的。

2024-09-11 12:20:02 542

原创 多线程篇(其它容器- CopyOnWriteArrayList)(持续更新迭代)

并发包中的并发List只有CopyOnWriteArrayList。CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行的修改操作都是在底层的一个复制的数组(快照)上进行的,也就是使用了写时复制策略。CopyOnWriteArraylist的类图结构如图:在CopyOnWriteArrayList的类图中,每个CopyOnWriteArrayList对象里面有一个array数组对象用来存放具体元素,ReentrantLock独。

2024-09-11 12:19:33 1174

原创 多线程篇(阻塞队列- LinkedTransferQueue)(持续更新迭代)

LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。可以算是 LinkedBolckingQueue 和SynchronousQueue 的合体。LinkedTransferQueue是一种无界阻塞队列,底层基于单链表实现,其内部节点分为数据结点、请求结点;基于CAS无锁算法实现。

2024-09-10 09:15:47 671

原创 多线程篇(阻塞队列- SynchronousQueue)(持续更新迭代)

前面谈到BlockingQueue的使用场景,并重点分析了ArrayBlockingQueue的实现原理,了解到ArrayBlockingQueue底层是基于数组实现的阻塞队列。但是BlockingQueue的实现类中,有一种阻塞队列比较特殊,就是SynchronousQueue(同步移交队列),队列长度为0。作用就是一个线程往队列放数据的时候,必须等待另一个线程从队列中取走数据。同样,从队列中取数据的时候,必须等待另一个线程往队列中放数据。这样特殊的队列,有什么应用场景呢?

2024-09-10 09:14:43 558

原创 多线程篇(阻塞队列- PriorityBlockingQueue)(持续更新迭代)

PriorityBlockingQueue 真的是个神奇的队列,可以实现优先出队。最特别的是它只有一个锁,入队操作永远成功,而出队只有在空队列的时候才会进行线程阻塞。可以说有一定的应用场景吧,比如:有任务要执行,可以对任务加一个优先级的权重,这样队列会识别出来,对该任务优先进行出队。

2024-09-09 09:32:58 1297

原创 多线程篇(阻塞队列- DelayQueue)(持续更新迭代)

DelayQueue是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。方法抛出异常返回值一直阻塞超时退出插入方法addofferput移除方法removepolltakePoll(time)检查方法elementpeekN/AN/A。

2024-09-09 09:32:08 847

原创 多线程篇(阻塞队列- LinkedBlockingQueue)(持续更新迭代)

能是0或c>0,如果是c=0,那么说明之前消费线程已停止,条件对象上可能存在等待的消费线程,添加完数据后应该是c+1,那么有数据。程了,所以c>0唤醒消费线程得意义不是很大,当然如果添加线程一直添加元素,那么一直c>0,消费线程执行的换就要等待下一次调用消。这是因为消费线程一旦被唤醒是一直在消费的(前提是有数据),所以c值是一直在变化的,c值是添加完元素前队列的大小,此时c只可。唤醒其他消费线程,如果添加前c>0,那么很可能上一次调用的消费线程后,数据并没有被消费完,条件队列上也就不存在等待的消费线。

2024-09-08 09:57:35 773

原创 多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

LinkedBlockingDeque使用双端队列,通过ReentrantLock保证线程安全,实现了双端的线程安全的阻塞队列。

2024-09-08 09:56:31 687

原创 多线程篇(阻塞队列- ArrayBlockingQueue)(持续更新迭代)

ArrayBlockingQueue 是一个环形数组,通过维护队首、队尾的指针,来优化(避免了数组的插入和删除,带来的数组位置移动)插入、删除,从而使时间复杂度为O(1).

2024-09-07 19:12:36 830

原创 多线程篇(阻塞队列- BlockingQueue)(持续更新迭代)

JDK中提供了一系列场景的并发安全队列。总的来说,按照实现方式的不同可分为阻塞队列和非阻塞队列。阻塞队列使用锁实现,而非阻塞队列则使用 CAS 非阻塞算法实现。阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。

2024-09-07 18:49:45 1424

原创 多线程篇(并发相关类- 原子操作类)(持续更新迭代)

JUC包提供了一系列的原子性操作类,这些类都是使用非阻塞算法CAS实现的,相比使用锁实现原子性操作这在性能上有很大提高。由于原子性操作类的原理都大致相同,这里讲解最简单的AtomicLong类的实现原理以及JDK 8中新增的LongAdder和LongAccumulator类的原理。有了这些基础,再去理解其他原子性操作类的实现就不会感到困难了。

2024-09-06 19:48:45 894

原创 多线程篇(并发相关类- 随机数类生成器)(持续更新迭代)

ThreadLocalRandom使用ThreadLocal的原理,让每个线程都持有一个本地的种子变量,该种子变量只有在。UUID 的目的,是让分布式系统中的所有元素,都能有唯一的辨识资讯,随机数的生成需要一个默认的种子,这个种子其实是一个long类型的数字,你可以在创建Random对象时通过。每个Random实例里面都有一个原子性的种子变量用来记录当前的种子值,当要生成新的随机数时需要根据当。算随机数来计算新的种子时,多个线程会竞争同一个原子变量的更新操作,由于原子变量的更新是CAS操作,

2024-09-06 19:48:03 1025

原创 多线程篇(工具类(CountDownLatch & CyclicBarrier & Semaphore & Exchanger & Phaser等))(持续更新迭代)

在JDK的并发包里提供了几个非常有用的并发工具类。CountDownLatch、CyclicBarrier 和 Semaphore工具类提供了一种并发流程控制的手段,Exchanger工具类则提供了在线程间交换数 据的一种手段。本章会配合一些应用场景来介绍如何使用这些工具类。CountDownLatch允许一个或多个线程等待其他线程完成操作假如有这样一个需求:我们需要解析一个Excel里多个sheet数据,此时可以考虑使用多线程,每个线程解析一。

2024-09-06 19:45:37 1015

原创 多线程篇(CAS & AQS(AQS))(持续更新迭代)

目录一、AQS是什么二、AQS的类图结构1. 主要成员变量1.1. exclusiveOwnerThread1.2. head,tail1.3. state2. 内部类2.1. ConditionObject2.2. Node3. 同步器的通用模板方法acquire(int arg)release(int arg)acquireShared(int arg)releaseShared(int arg)acquireInterruptibly(int

2024-09-05 20:29:04 878

原创 多线程篇(CAS & AQS(CAS))(持续更新迭代)

CAS(Compare and Swap)是一种无锁操作,通过比较内存中的值与预期值是否相等来实现原子操作,解决并发环境下的数据竞争问题。

2024-09-05 20:26:56 995

原创 多线程篇(可见性 & 原子性 & 有序性(原子性))(持续更新迭代)

在之前的文章中volatile关键字在并发中有哪些作用,我们知道了 volatile关键字可以保证可见性、有序性,但无法保证原子性的。今天我们来聊聊synchronized关键字,其可以同时保证三者,实现线程安全。在 Java 早期版本中,synchronized 属于 重量级锁,效率低下;不过在 Java 6 之后,Java 官方对从 JVM 层面对 synchronized 较大优化,所以现在的 synchronized 锁效率也优化得非常不错。目前不论是各种开源框。

2024-09-04 10:57:19 1649

原创 多线程篇(可见性 & 原子性 & 有序性(有序性))(持续更新迭代)

java语言规范规定JVM线程内部维持顺序化语义。即只要程序的最终结果与它顺序化情况的结果相等,那么指令的执行顺序可以与代码顺序不一致,此过程叫指令的重排序。

2024-09-04 09:10:30 993

原创 多线程篇(可见性 & 原子性 & 有序性(可见性))(持续更新迭代)

我们已经知道使用锁的方式可以解决共享变量内存可见性问题,但是使用锁太笨重,因为它会带来线程上下文的切换开销。对于解决内存可见性问题,Java 还提供了一种弱形式的同步,也就是使用 volatile 关键字。该关键字可以确保对一个变量的更新对其他线程马上可见。当一个变量被声明为 volatile 时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回主内存。当其他线程读取该共享变量时,会从主内存重新获取最新值,而不是使用当前线程的工作内存中的值。

2024-09-03 10:08:10 1551

原创 多线程篇(ThreadLocal & 内存模型 & 伪共享(伪共享))(持续更新迭代)

为了解决计算机系统中主内存与CPU之间运行速度差问题,会在CPU与主内存之间添加一级或者多级高速缓冲存储器(Cache)。这个 Cache 一般是被集成到 CPU 内部的,所以也叫 CPU Cache,如图所示是两级 Cache 结构。在 Cache 内部是按行存储的,其中每一行称为一个 Cache 行。Cache 行是 Cache 与主内存进行数据交换的单位,Cache 行的大小一般为 2 的幂次数字节。

2024-09-03 07:28:57 1490

原创 多线程篇(ThreadLocal & 内存模型 & 伪共享(内存可见性))(持续更新迭代)

在许多场景下,让计算机同时去做几件事情,不仅是因为计算机的运算能力强大了,还有一个很重要的原因是计算机的运算速度与 它的存储和通信子系统的速度差距太大,大量的时间都花费在磁盘I/O、网络通信或者数据库访问上。如果不希望处理器在大部分时间里都处于等待其他资源的空闲状态,就必须使用一些手段去把处理器 的运算能力“压榨”出来,否则就会造成很大的性能浪费,而让计算机同时处理几项任务则是最容易想 到,也被证明是非常有效的“压榨”手段。

2024-09-02 09:25:00 1246

原创 多线程篇(ThreadLocal & 内存模型 & 伪共享(ThreadLocal ))(持续更新迭代)

多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对一个共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步,如图。同步的措施一般是加锁,这就需要使用者对锁有一定的了解,这显然加重了使用者的负担。那么有没有一种方式可以做到,当创建一个变量后,每个线程对其进行访问的时候,访问的是自己线程的变量呢?其实 ThreadLocal 就可以做这件事情,虽然 ThreadLocal 并不是为了解决这个问题而出现的。

2024-09-02 09:10:31 1222

原创 多线程篇(锁相关类- LockSupport(锁基层类))(持续更新迭代)

JDK 中的 rt.jar 包里面的 LockSupport 是个工具类,它的主要作用是挂起和唤醒线程,该工具类是创建锁和其他同步类的基础。LockSupport类与每个使用它的线程都会关联一个许可证,在默认情况下调用LockSupport 类的方法的线程是不持有许可证的。LockSupport 是使用 Unsafe 类实现的,下面详细介绍一下。LockSupport是concurrent包中的一个线程阻塞工具类,所有的方法都是静态方法,不提供构造,可以让。

2024-09-01 08:42:03 1336

原创 多线程篇(锁相关类- StampedLock(改进的读写锁)(JDK8新增))(持续更新迭代)

StampedLock 是并发包里面 JDK8 版本新增的一个锁,该锁提供了三种模式的读写控制,当调用获取锁的系列函数时,会返回一个 long 型的变量,我们称之为戳记(stamp),这个戳记代表了锁的状态。其中 try 系列获取锁的函数,当获取锁失败后会返回为 0 的 stamp 值。当调用释放锁和转换锁的方法时需要传入获取锁时返回的 stamp 值。// 成员变量// 锁实例// 排它锁---写锁(writeLock)try {}finally {

2024-09-01 08:40:08 1010

空空如也

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

TA关注的人

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