自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 AbstractQueuedSynchronizer(AQS) 源码细致分析 - Semaphore 源码分析

1、简介Semaphore,信号量,它保存了一系列的许可 (permits),每次调用 acquire() 方法都将消耗一个许可,每次调用 release() 方法都将归还一个许可。Semaphore 通常用于限制同一时间对共享资源的访问次数上,也就是说常说的限流。Semaphore 信号量,获取同行证流程图。2、入门案例案例1public class Pool { /** * 可同时访问资源的最大线程数 */ private static fina

2022-02-18 15:04:41 323

原创 AbstractQueuedSynchronizer(AQS) 源码细致分析 - CyclicBarrier 源码分析

1、简介**CyclicBarrier **,回环栅栏,它会阻塞一组线程直到这些线程同时达到某一个条件才继续执行。它与 CountDownLatch 很类似,但是又不同,CountDownLatch 需要调用 countDown() 方法触发事件,而 CyclicBarrier 不需要,它就像一个栅栏一样,当一组线程都到达了栅栏处才继续往下走。工作原理图CyclicBarrier 与 CountDownLatch 的异同?两者都能实现阻塞一组线程被唤醒;前者是最后一个线程到达的时候自动唤

2022-02-17 17:16:34 541

原创 AbstractQueuedSynchronizer(AQS) 源码细致分析 - Condition 条件队列流程分析

AbstractQueuedSynchronizer(AQS) 源码细致分析 - Condition 条件队列流程分析AQS 源码探究 Condition 条件队列 (手写一个入门的 BrokingQueue)1、Condition 队列介绍AQS 中还有另一个非常重要的内部类 ConditionObject,它实现了 Condition 接口,主要用户实现条件锁。ConditionObject 中也维护了一个队列,这个队列主要用于等待条件的成立,当条件成立,其他线程将 signal 这个队列

2022-02-17 13:41:09 436

原创 AbstractQueuedSynchronizer(AQS) 源码细致分析 - CountDownLatch 源码分析

AbstractQueuedSynchronizer(AQS) 源码细致分析 - CountDownLatch 源码分析1、CountDownLatch 简介CountDownLatch,是一个简单的同步器,它的含义是 允许一个或者多个线程等待其他线程的操作执行完毕后再执行后续的操作。CountDownLatch 的通常用法和 Thread.join() 有点类似,等待其他线程都完成后再执行主任务。2、入门案例分析案例1:对于像我一样的学生来说,CountDownLatch 的实际开发应用

2022-02-17 11:04:02 444

原创 AbstractQueuedSynchronizer(AQS) 源码细致分析 - 释放锁、响应中断加锁流程分析

AQS 成员方法解析 - 释放锁逻辑1、unlock() 方法:释放锁// 位于ReentrantLock类中:释放锁的方法public void unlock() { //释放锁 sync.release(1);}// 位于AQS的静态内部类Sync中:真正释放锁的方法// RentrantLock.unlock() -> sync.release()public final boolean release(int arg) { // tryRelease.

2022-02-15 16:25:26 184

原创 AbstractQueuedSynchronizer(AQS) 源码细致分析 - 加锁竞争资源分析

1、简介AQS 的全称是 AbstractQueuedSynchronizer,它的定位是为 JAVA 种几乎所有的锁和同步器提供一个基础框架AQS 是基于 FIFO 队列实现的,并且内部维护了一个状态变量 state,通过原子更新这个状态变量 state 即可实现加锁解锁操作。主要内部类 Nodestatic final class Node { /** Marker to indicate a node is waiting in shared mode */ // 枚举

2022-02-15 15:41:40 309

原创 AQS 源码探究_01 手写一个简化的 ReentrantLock 可重入锁

AQS 源码探究_01 手写一个简化的 ReentrantLock 可重入锁完整代码Lock/** * @author wcc * @date 2022/2/10 22:13 */public interface Lock { void lock(); void unlock();}MinReentrantLockimport sun.misc.Unsafe;import java.lang.reflect.Field;import java.util.conc

2022-02-11 19:42:33 240

原创 线程池 ThreadPoolExecutor 源码详细分析

线程池 ThreadPoolExecutor 源码详细分析1、线程池的作用一方面当执行大量一步任务的时候线程池能够提供较好的性能,在不使用线程池的时候,每当需要执行异步的时候都是直接 new 一线程进行运行,而线程的创建和销毁都是需要开销的。使用线程池的时候,线程池里面的线程是可复用的,不会每次执行异步任务的时候都重新创建和销毁线程。另一方面线程池提供了一种资源限制和管理的手段,比如可以限制线程的个数,动态新增线程等,每个 ThreadPoolExecutor 也保留了一些基本的统计数据,比如当前线程

2022-02-10 16:42:28 1288

原创 线程池源码分析_01 FutureTask源码分析

文章参考:硬核手撕Java线程池FutureTask源码1、FutureTask简介Future 是我们在使用 JAVA 异步的时候最常用到的一个类,我们可以向线程池提交一个 Callable 对象,并通过 Future 对象获取执行结果。FutureTask 的使用场景:FutureTask 可用于异步获取执行结果或者取消执行任务的场景。通过传入 Runnable 或者 Callable 任务对象给 FutureTask,直接调用其 run() 方法或者放入线程池执行,之后可以在外部通过 F.

2022-01-29 13:08:16 502

原创 JDK1.8 ConcurrentHashMap 源码方法解析 02

put() 方法是并发 HashMap 源码分析的重点方法,这里涉及到并发扩容,桶位寻址等等…JDK1.8 ConcurrentHashMap 的结构图:1、put(K key, V value) 方法源码解析// 向并发 HasHMap 中put一个数据public V put(K key, V value) { return putVal(key, value, false);}// 向并发 HashMap 中put一个数据// key:数据的key// value:数据的.

2022-01-24 23:26:28 461

原创 JDK1.8 ConcurrentHashMap源码细致分解01

文章参考:小刘讲源码ConcurrentHashMap 源码解析_01 成员属性、内部类、构造方法解析1、简介ConcurrentHashMap 是 HashMap 的线程安全版本,内部也是使用(数组 + 链表 + 红黑树)的结构来存储元素。相比于同样线程安全的 HashTable 来说,效率等等各方面都有极大的提升。在学习 ConcurrentHashMap 源码之前,这里默认大家已经读过 HashMap 源码,了解 LongAdder 原子类、红黑树。参考:红黑树学习笔记(自己实现一个简单.

2022-01-18 13:22:54 638

原创 JDK 8 新特性 LongAdder 源码解析

1、LongAdder 由来LongAdder 类是JDK 1.8新增的一个原子性操作类。AtomicLong 通过 CAS 算法提供了非阻塞的原子性操作,相比使用阻塞算法的同步器来说性能已经是很好了,但是 JDK 开发者并不满足于此,因为经常搞并发的请求下 AtomicLong 的性能是不能让人接受的。如下 AtomicLong 的 getAndIncrement 的代码,虽然 AtomicLong 使用 CAS 算法,但是在高并发的情况下, CAS 只能有一个线程操作成功,其他线程失败后还是通过无限

2022-01-07 20:52:01 684

原创 JAVA 并发基石 - CAS 原理实战

本文根据小刘老师视频而出:Java并发基石-CAS原理实战在学习 CAS 之前,先从一个简单的 案例入手,进而引出 CAS 的基本使用。基于 CAS 的网站计数器需求:我们开发一个网站,需要对访问量进行统计,用户每发送一次请求,访问量 + 1,如何实现?我们模拟有 100 个人同时访问,并且每个人对咱们的网站发起 10 次请求,最后总访问次数应该是 1000次1.1、网站访问统计 Demo/** * @author wcc * @date 2022/1/6 13:45 */publi

2022-01-06 18:22:48 468 2

原创 JDK 集合LinkedHashMap源码解析

LinkedHashMap 简介LinkedHashMap 内部维护了一个双向链表,能保证元素按照插入顺序访问,也能以访问顺序访问。LinkedHashMap 可以看成是 LinkedList + HashMap。LinkedHashMap 继承 HashMap,拥有 HashMap 的所有特性,并且额外增加了按照一定顺序访问的特性,LinkedHashMap 默认存储顺序为插入顺序,也可以按照访问顺序存储元素。案例@Testpublic void test01(){ HashM

2022-01-05 16:26:54 405

原创 Zookeeper 视频学习

1、ZooKeeper 入门1.1、概述Zookeeper 是一个开源的分布式的、为分布式框架提供协调服务的 Apache 项目。Zookeeper 工作机制Zookeeper 从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接收观察者的注册,一旦这些数据的状态发生变化,Zookeeper 就将负责通知已经在 Zookeeper上注册的那些观察者做出相应的反应。如果不了解观察者模式的伙伴可以取看看这篇博客:JAVA设计模式 ———— 观察者

2021-12-26 12:32:29 1553

原创 狂神老师后端开发 Vue 学习笔记

狂神老师后端开发 Vue 学习笔记1、Vue 引言渐进式:JavaScript 框架 – 摘自官网# 渐进式: 1.易用 html css javascript 2.高效 开发前端页面,非常高效 3.灵活 开发灵活,多样性# 总结 Vue 是一个javascript 框架 # 后端服务端开发人员: Vue 渐进式javascript框架:让我们通过操作很少的 Dom,甚至不需要操作页面中任何DOM元素,就很容易的完成数据和视图的绑定 注意:日后再使用Vue过程中页面不要再引

2021-12-23 10:40:56 939

原创 HashMap 底层源码细致分析

JDK集合HashMap 底层源码细致分析前言提示:对于初始 HashMap 的小伙伴来说,不推荐直接硬啃,建议先看一下如下几个视频教程之后再回头好好理解。(一遍看不懂则反复看,一小块一小块的找对应博客阅读)红黑树源码讲解小刘老师讲HashMap源码黑马老师讲HashMap源码散列(哈希)表核心理论:Hash 也称散列、哈希,对应的英文都是 Hash。基本原理就是把任意长度的输入,通过 hash 算法变成固定长度的输出。这个映射的规则就是对应的 Hash 算法,而原始数据映射后的

2021-12-21 12:59:21 988

原创 红黑树学习笔记(自己实现一个简单的红黑树)

红黑树的学习笔记(自己实现一个简单的红黑树)最近在学习树的一些东西,想把树从头开始总结一下巩固自己的印象。1、树结构入门1.1、什么是树?树(tree)是一种抽象数据类型(ADT),用来模拟具有树状结构性质的数据集合。它是由n(n>0)个有限节点通过连接它们的边组成一个具有层次关系的集合。把它叫做树是因为它看起来像一颗倒挂的树,也就是说它是根朝上的,而叶是朝下的。树有很多种,像下面的一个节点有多余两个子节点的树,称为多路树,而每个节点最多只能有两个子节点的一种形式称为二叉树。节点:上

2021-12-15 22:46:50 1227

原创 八大经典排序算法(动图演示)

0、算法概述0.1、算法分类十种常用的排序算法可以分为两大类:比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。0.2、算法复杂度0.3、相关概念稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的前面。

2021-12-02 21:15:03 985

原创 JAVA 设计模式—————— 命令模式和职责链模式

学习 Netty 前的准备工作!!这里,还是先来复习一下 OOP (面向对象)的七大原则:开闭原则:对扩展开放,对修改关闭里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立。依赖倒置原则:要面向接口编程,不要面向实现编程单一职责原则:要控制类的粒度大小,将对象解耦,提高其内聚性接口隔离原则:要为各个类创建它们需要的专用接口迪米特法则:尽量先使用合并或者聚合等关联关系来实现,其次才考虑使用继承关系来实现命令模式(详解版)在软件开发系统中,方法的请求者 与 方法的实现者之间经常存在

2021-11-22 14:11:08 1097

原创 JAVA 设计模式—————— 观察者模式

学习 Netty 前的准备工作!!这里,先来复习一下 OOP(面向对象)的七大原则:开闭原则:对扩展开放,对修改关闭里氏替换原则:继承必须确保超类所拥有的性质在子类中仍然成立依赖倒置原则:要面向接口编程,不要面向实现编程单一职责原则:要控制类的粒度大小,将对象解耦,提高其内聚性接口隔离原则:要为各个类创建它们需要的专用接口迪米特法则:只与你的直接朋友交谈,不跟陌生人说话合成复用原则:尽量先使用或者聚合等关联关系来实现,其次才考虑使用继承关系来实现1、模式的定义与特点观察者(Obser

2021-11-21 13:16:48 982

原创 SpringBoot 整合 JWT 实现 Token 登录验证的简单实现

SpringBoot 整合 JWT 实现 Token 登录验证的实现在实现案例之前,要先去理解 JWT 的概念 以及 它与传统方式的区别和优点。1、什么是 JWT?JSON WEB TOKEN (JWT),是为了在网络应用环境间传递声明而执行的一种基于 JSON 的开放标准(RFC 7519),该 TOKEN 被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其他

2021-11-19 17:51:16 1699

原创 RabbitMQ 视频学习(高级篇)

RabbitMQ 视频学习(高级篇)1、死信队列1.1、死信的概念先从概念上解释,搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说,Procedure 将消息投递到 Broker 或者 直接到 Queue 里面了,Consumer 从Queue 取出消息进行消费,但是某些时候由于特定的原因导致 Queue 中的某些消息无法被消费,这样的消息如果没有后续的处理,就变成了死信,有死信自然而然就有了死信队列。应用场景:为了保证订单业务的消息数据不丢失,需要使用到 Rabb

2021-11-17 17:57:51 968

原创 RabbitMQ 视频学习(基础篇)

RabbitMQ 视频学习(基础篇)本文以 阿里云 为基础,参考的是尚硅谷的视频:尚硅谷2021新版RabbitMQ教程 | 快速掌握MQ消息中间件1、MQ 的相关概念1.1、什么是 MQ?MQ(Message Queue),从字面意思上看,本质上是个队列,FIFO先入先出,只不过队列中存放的内容是 message 而已,还是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ是一种非常常见的上下游"逻辑解耦 + 物理解耦"的消息通信服务。使用了MQ之后,消息发送上游只需要依赖MQ,不用依

2021-11-11 12:10:07 1499

原创 视频 Docker 学习(高级篇)

视频 Docker 学习(进阶篇)1、容器数据卷1.1、什么是容器数据卷?将应用和环境打包成一个镜像!数据?如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化!MySQL,容器删除了,删库跑路,需求:MySQL数据可以存储在本地!容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!这就是卷技术!目录挂载,将我们容器内的目录,挂载到Linux上面!总结一句话:容器的持久化和同步操作!容器间也是可以数据共享的。1.2、使用数据卷方式一:直接使

2021-10-26 19:52:58 390

原创 视频Docker学习笔记(基础篇)

1、Docker 概述Docker 为什么会出现?一款产品:开发 - 上线 两套环境,应用配置!开发 - 运维。问题:我在我的电脑上可以允许!版本更新,导致服务不可用! 用于运维来说考验十分大!环境配置是十分的麻烦,每一个集群都要部署环境(集群Redis、ES、Hadoop…)!费时费力!发布一个项目(jar+(Redis、MySQL、JDK、ES)),项目能不能带上环境安装打包!之前在服务器配置一个应用的环境Redis、MySQL、JDK、ES、Hadoop 配置超麻烦了,不能够跨平台。开发

2021-10-20 17:51:40 531

原创 操作系统的学习

操作系统的第一章本文以王道考研视频来作为学习基础一、操作系统的概念、功能和目标操作系统的定义操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理的组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是计算机系统中最基本的系统软件。操作系统的功能和目标操作系统作为系统资源的管理者(这些资源包括软件、硬件、文件等),需要提供什么功能?操作系统作为用户与计算机硬件之间的接口,要为其上层的用户、应用程序提供简单易用的服务,需要实现什么功能?操作系统作为最接近硬件的

2021-10-19 21:07:38 1616

原创 JMM内存模型、volatile关键字保证有序性和可见性相关问题总结

JMM内存模型、volatile关键字保证有序性和可见性相关问题总结1、什么是JAVA内存模型?首先要知道,JAVA内存模型指的是JMM,而不是运行时数据区哦~JAVA语言为了保证并发编程中可以满足原子性、可见性以及有序性,于是推出了一个概念就是JMM内存模型。JMM内存模型,目的是为了在多线程条件下,使用共享内存进行数据通信的时候,通过对多线程程序读操作、写操作行为规范约束,来尽量避免多次内存数据存取不一致,编译器对代码指令重排序、处理器对代码乱序执行等带来的问题。JMM内存模型将主要划分为

2021-10-09 19:18:34 192

原创 JAVA面试 —————— 操作系统

JAVA面试 —————— 操作系统1、请分别说一说进程和线程的以及它们的区别?根本区别:进程是操作系统进行资源分配和调度的基本单位,而线程是任务调度和执行的基本单位。包含关系:一个进程最少由一条线程组成。所处环境区别:在操作系统中能同时运行多个进程(程序);而在同一个进程中有多个线程同时执行(通过CPU调度,在每个时间片中只有一个线程执行)。内存分配:系统在运行的时候会为每个进程分配不同的内存空间;而对线程而言,除了CPU外,系统不会为线程分配内存(线程所使用的资源来自其所属进程的资源),线

2021-10-09 09:39:37 291 1

原创 JAVA面试 —————— 计算机网络篇

JAVA实习面试 —————— 计算机网络篇1、OSI 七层结构、TCP/IP四层结构、五层协议结构OSI七层:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层TCP/IP 四层:网络接口层、网际层、运输层、应用层五层协议:物理层、数据链路层、网络层、运输层、应用层注意:按照从下到上的顺序。OSI七层参考模型,每一层的作用:对应的层作用对应的网络协议/硬件物理层提供数据传输的硬件保证,网卡接口,传输介质中继器、集线器、网关数据链路层进行数据交

2021-10-08 20:04:39 658

原创 JAVA面试题 —————— JVM篇02

JAVA面试题 —————— JVM篇021、请你说一说JAVA中的五种引用?JAVA中都有哪些引用类型?强引用只要沿着GC ROOT的引用链能够找到该对象,就不会被垃圾回收;只有当GC ROOT都不引用该对象的时候,才会回收强引用对象。换句话说就是,只要强引用存在,JVM垃圾回收器就永远不会回收被引用的对象,内存不足的时候,JVM会抛出OutOfMemoryError。比如:new一个对象Student,将对象Student通过=(赋值运算符),赋值给变量stu,即变量stu就强引用了对象S

2021-10-07 23:16:55 164

原创 JAVA面试题 —————— JVM篇01

JAVA面试题 —————— JVM篇011、请你简述一下JAVA内存结构(运行时数据区)如图所示:1.1、程序计数器程序计数器:线程私有。一块较小的内存空间,程序计数器用于保存JVM中下一条所要执行的字节码指令的地址!如果正在执行的是Native方法,则这个计数器值为空,程序计数器在硬件层面是通过寄存器实现的。JAVA指令执行流程:.java代码源文件经过编译为.class二进制文件.class文件中的每一条二进制字节码指令(JVM指令)通过解释器转换成机器码,然后就可以被CPU

2021-10-07 16:09:38 185

原创 JAVA实习生面试总结 ———— JAVAWEB篇

JAVA实习生面试总结 ———— JAVAWEB篇1、JSP和Servlet有什么区别?JSP经过编译后就变成了Servlet(JSP的本质就是Servlet,JVM只能识别JAVA的类,不能识别JSP的代码,WEB容器将JSP的代码编译成JVM能够识别的JAVA类)。JSP更擅长表现于页面显示,Servlet更擅长于逻辑控制。Servlet中没有内置对象,JSP中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet

2021-10-05 16:43:52 226

原创 JAVA面试题 ——— JAVA基础知识篇(三)

JAVA面试题 ——— JAVA基础知识篇(三)1、请你说一下什么是面向对象?JAVA是面向对象的编程语言,不同于C语言是面向过程的。对于面向对象和面向过程的区别,举一个简单的例子说明一下(我们以洗衣机洗衣服为例):面向过程:面向过程的编程方式,程序会将要完成的某一个任务拆解成一系列的小步骤(函数),如:打开洗衣机:method01()放入要洗的衣服:method02()放入洗衣粉:method03()清洗:method04()烘干:method05()面向对象:面向对象的编程

2021-10-04 21:46:23 189

原创 String StringBuilder StringBuffer区别以及源码分析

String StringBuilder StringBuffer区别以及源码分析1、String、StringBuilder、StringBuffer区别1.1、StringString对象一旦创建之后就是不可变的,不可变的!问题:既然String对象是不可变的,那么其包含的常用修改值的方法是如何实现的呢?Demosubstring(int,int) 字符串截取split(String,int) 字符串分割toLowerCase() 字符串所有字母小写其实,这些方法底层都是通过重新

2021-10-03 21:21:50 318 2

原创 JDK集合源码之LinkedList解析

JDK集合源码之LinkedList解析1、LinkedList继承体系**LinkedList:**LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用。从继承体系可以看出,LinkedList实现了Cloneable和Serializable接口,说明其可以被克隆,也可以被序列化!同样的,LinkedList被克隆的时候,和ArrayList一样二者均是浅拷贝。下面进入正题 --------- 分析源码:2、LinkedLIst的基本属性t

2021-10-03 20:45:43 152

原创 ThreadLocal源码夺命12问,你能坚持到第几问?

ThreadLocal源码面试1、面试官:请你说一说你对ThreadLocal的理解?ThreadLocal是一个全局对象,ThreadLocal是线程范围内变量共享的解决方案;threadLocal可以看作是一个map集合,key就是当前线程对象,value就是要存放的变量。ThreadLocal对象可以给每个线程分配一份属于自己的局部变量副本,多个线程之间可以互不干扰。一般我们会重写initivalue()方来给当前ThreadLocal对象赋初始值。2、面试官:简单描述一下JDK1.8中,

2021-10-03 20:42:31 206

原创 ThreadLocal源码分析_02内核(ThreadLocalMap)

ThreadLocal源码分析_02内核(ThreadLocalMap)本篇主要介绍ThreadLocal的内核ThreadLocalMap(ThreadLocal的静态内部类),在学习ThreadLocalMap内核之前,再来复习一下ThreadLocal的执行流程:下面就正式分析一下ThreadLocalMap的原理:1、成员属性 /** * 初始化当前map内部散列表数组的初始长度 */ private static fina

2021-10-03 20:41:49 139

原创 ThreadLocal源码分析_01入门案例以及表层源码分析

ThreadLocal源码分析_01入门案例以及表层源码分析1、ThreadLocal简介ThreadLocal是一个全局对象,ThreadLocal是线程范围内变量共享的解决方案;**ThreadLocal可以看作是一个map集合,key就是当前线程,value就是要存放的变量。**eg如下://声明一个ThreadLocal实例ThreadLocal threadLocal = new ThreadLocal();//随机获取一个数字hint n = new Random().nextI

2021-10-03 20:40:56 127

原创 MySQL面试题的补充总结

MySQL面试题的补充总结MySQL联表查询条件中WHERE和ON的区别先来看一个关联查询的DEMO:select * from student s left join class c on s.classId=c.id order by s.id查询结果如下:下面在ON条件中拼接一个条件:s.name="张三"select * from student s left join class c on s.classId=c.id and s.name="张三" order by s.id

2021-10-03 20:33:40 144

空空如也

空空如也

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

TA关注的人

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