- 博客(33)
- 收藏
- 关注
原创 对Mysql的QPS暴增,Mysql会怎么样
高并发会打挂mysql,那么mysql是怎么挂的?是io挂?mysql集群挂?还是mysql服务进程挂?还是单纯进程处理变慢?
2023-01-17 20:56:10
588
1
原创 jdk动态代理类由什么生成
网上很多文章都将jdk动态代理于反射连接起来,甚至很多文章都说 采用反射生成jdk动态代理。 这也让我深信不疑,认为jdk的动态代理类就是反射生成的。知道有一天,字节跳动的面试官问我面试官:动态代理的代理类是怎么生成的?我:反射(毫不犹豫)面试官:是吗?我:啊,不是吗?(懵了)其实jdk动态代理类是由asm生成的,反射只是在整个动态代理中起到了辅助的作用。JDK的动态代理中哪里使用了反射动态代理都是一般这样写: public static void main(String[] args)
2021-04-24 17:59:47
408
原创 Tomcat四大容器,Servlet的doGet方法在tomcat的哪里调用,tomcat的类加载过程,打破双亲委派
tomcat部署应用的三种方式三种方法被写死在tomcat的HostConfig.java中:org/apache/catalina/startup/HostConfig.java使用xml描述部署:在tomcat的server.xml文件中添加<context path=“name” docBase=“应用文件的路径”></context>节点使用war包部署:将一个war包放到tomcat中使用文件部署:将要部署的项目的文件夹告诉tomcat,让tomcat自己去找
2021-04-05 11:17:56
604
原创 简述linux实现 TCP,Socket的由来
linux实现 TCP强调一下,TCP属于传输层的协议,由操作系统来完成,这个传输层的协议是一个可靠的传输协议,主要完成对数据的传输,对数据内容不关心。对于linux来说:对TCP的实现主要在linux-5.11.11/net/ipv4包下的 tcp_input.c,tcp_output.c 两个文件下。这些文件提供了tcp_connect() tcp_send_synack()等 方法,用于创建tcp连接/* Build a SYN and send it off. *///三次握手的第一个阶段
2021-04-05 11:13:32
256
原创 通过反射来破解饿汉式单例
在通常情况下饿汉式,懒汉式,静态内部类方式,的方法保证了单例,但是别有用心的人可以通过反射 将 .class(字节码文件) load到内存,然后new出一个实例。但是枚举类因为没有构造方法,所以反射无法new出对象,就避免了通过反射来创建对象。通过反射来破解饿汉式单例public class test { public static void main(String[] args) { Class<?> c = null; Person1 perso
2020-11-25 21:58:10
225
原创 使用YAMl代替XML配置文件
文章目录YAML什么是YAMLYAML有以下基本规则:自定义参数参数引用随机数外部参入优先级多环境配置使用YAML完成多环境配置方式一:单一yaml文件 配合多propertys文件方式二:单一yaml文件内配置所有变量YAML在之前的实例中,我们使用了src/main/resources/application.properties对我们的项目做了个性化的配置,这种配置方式简单明了,也是我们经常使用的但是应对复杂的商业需求下,多环境和编程化的配置无法得以满足为此Spring Cloud为我们提供.
2020-10-26 08:21:41
1128
原创 基于XML的依赖注入及循环依赖问题
IoC概念IoC是一个概念,是一种思想,其实现方式多种多样。当前比较流行的实现方式之一是DI。基于XML的DI<?xml version="1.0" encoding="UTF-8"?><!-- 一个xml文件 只有一个标签,这个标签就是beans,所有的东西都放在这个标签里面 --><!-- 1. xmlns:xmlnamespace,后面接的是url,它与类的pakage一样,是唯一标示的id--><!-- 2. xmlns:xsi : 全称是xm
2020-10-26 08:17:57
795
2
原创 Mybatis-学习笔记
mybatisMyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,使开发者只需要关注SQL本身,而不需要花费精力去处理例如注册驱动、创建connection、创建statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。配置文件MybatisConfig.xmlSSM中需要配置数据url数据库连接池映射文件事务在SpringBoot中整合到property中了Mapper.xmlnamespace接口绑定 和接口就可以不用写DAO实现类,M
2020-10-25 09:34:49
91
原创 Set接口,LinkedHashSet,TreeSet
文章目录Set接口1. 概述2. Set接口下常用的实现类3. 添加元素的过程4. LinkedHashSet5. TreeSet5.1 概述5.2 自然排序5.3 定制排序Set接口1. 概述Set作为Collection的子接口,没有添加额外的方法,它存储无序的不可重复的数据,在开发中使用比较少,后面会看Map的源码,会了Map,Set就会了。所以Set的重点是理解它的无序性和不可重复性。为了保证无序性和不可重复性,我们要求添加到Set中的类要重写equals()和hashCode().重写的
2020-10-25 09:30:54
151
原创 Maven方式创建Spring工程学习笔记
Maven方式创建Spring工程什么是Mavenhttps://www.cnblogs.com/whgk/p/7112560.html工程创建1.新建项目 选择Maven Project [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vdh7nZeK-1603589067417)(file:///Users/luca/Downloads/InternetArchitect-master/01%20Spring/05%20maven%E7%
2020-10-25 09:27:35
92
原创 Map接口及HashMap的底层实现
1.Map接口[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eS3uqxtL-1603329417280)(/Users/luca/MarkText-img-Support/2020-06-14-22-18-23-image.png)]Map接口是1.2才有2. HashMap作为Map的主要实现类,线程不安全,但是效率高。1.2才有。可以存储null的key和value。在jdk7之前,使用的是数组+链表jdk8之后,为了提高效率,使用数组+链表+红黑树实现
2020-10-22 09:17:29
156
原创 List集合框架
文章目录List集合框架1.List的三个实现类2.ArrayList的源码分析2.1 jdk 7情况下2.2 jdk 8 中ArrayList的变化3.LinkedList的源码分析4. List接口添加的方法常用方法List集合框架1.List的三个实现类ArrayList:作为List接口主要实现类,线程不安全,效率高,底层使用object数组存储(Object[] elementData),可以通过Collections工具类使ArrayList变成线程安全的。Vector:作为List的古
2020-10-22 09:16:46
232
原创 Collection接口与Iterator接口
文章目录Collection接口与Iterator接口1. Iterable接口2. Iterator接口3. Iterator接口的实现类4.遍历4.1 概述4.2 用foreach()来遍历集合4.3 用forEach()方法来遍历4.4 用Iterator接口的实现类提供的 hasNext(),next()遍历集合4.5 用Iterator接口的实现类提供的forEachRemaining()方法来遍历集合5. Collection定义的操作集合元素的方法Collection接口与Iterator接
2020-10-22 09:15:47
1097
原创 java线程池使用及ThreadPoolExecutor源码分析
文章目录1线程池基础使用1.1 概述1.2 线程池的优点1.3 Exector继承图1.4 ExecutorService接口1.5 Executors工具类1.5.1 生成各种线程池的方法1.5.2 方法的使用示例1.5.3 各个方法的源码返回ThreadPoolExecutor对象的方法:返回ScheduledThreadPoolExecutor对象的方法:返回ForkJoinPool对象的方法1.2.5 线程池的工作流程1.2.6 ThreadPoolExecutor参数1.2.7 自定义线程池---
2020-10-22 08:44:46
354
原创 Volatile底层实现- 线程可见,指令重排+volatile与synchronized对比+使用hsdis观察volatile及synchronized
文章目录volatile的用途1.线程可见性2.防止指令重排序例子:DCL单例需不需要加volatile?3. volatile与synchronized的区别CPU的基础知识用hsdis观察synchronized和volatile输出结果volatile的用途volatile本意是“易变的,可变的”,它的作用是来保证 线程的可见性,和防止指令重排1.线程可见性[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOBgRKtz-1603325999246)(/User
2020-10-22 08:34:44
305
原创 Synchronized HotSpot底层实现-CAS + Unsafe类 + Synchronized锁升级
文章目录用户态与内核态CASUnsafe与原子类markword工具:JOL = Java Object Layoutsynchronized的横切面详解java源码层级字节码层级JVM层级(Hotspot)锁升级过程JDK8 markword实现表:锁重入synchronized最底层实现synchronized vs Lock (CAS)锁消除 lock eliminate锁粗化 lock coarsening参考资料说明:JVM并没有规定Synchronized应该怎么实现,这里说的是基于HotSp
2020-10-22 08:27:41
249
原创 Java锁-锁的分类+ReentrantLock+LockSupport
文章目录1. Java锁的种类1.1 乐观锁/悲观锁1.1.1 乐观锁(1) 数据版本机制(2) CAS操作1.2 悲观锁1.2 排他锁/共享锁1.3 读写锁1.4 可重入锁1.5 公平锁/非公平锁1.6 分段锁1.7 偏向锁/轻量级锁/重量级锁1.8 自旋锁2. Locks包3. Lock接口2.1 显示锁和隐式锁2.2 Lock接口规定的方法2.3 ReentrantLock2.3.1 使用示例2.3.2 ReentrantLock对比于synchronized的优点2.4 ReentrantReadW
2020-10-22 08:19:16
1231
1
原创 Java JUC包下Tools
1.2 CountDownLatch1.2.1 什么是CountDownLatchlatch-门栓 countdown-倒数。 倒数到0门栓打开。CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用
2020-10-22 08:14:40
112
原创 Java高并发容器
1. 高并发容器脑图我们之前就学习了Collection下面的List和Set两大类,Queue是后来(1.5)加入的接口,它专门就是为高并发准备的2. 从Hashtable到CHMHashtable之前说过,与Vector一样,是Map的一个古老的实现类,它的设计有不太合理的地方,比如:每一个方法都加了Synchronized。因为大多数的程序都是单个线程在跑;之后java的开发人员意识到了这一点,于是添加了一个HashMap,HashMap不只是把Synchronized去掉,它还把其他的
2020-10-22 08:14:27
489
原创 Java多线程基础-Thread类+多线程创建方法+实现线程同步
文章目录1. 线程的创建和启动1.1 概述1.2 创建多线程的方式一:继承Tread类1.3 Thread类常用方法1.4 线程优先级1.5 创建多线程的方式二:实现Runnalbe1.6 比较两种创建线程的方式1.7 线程的生命周期2. 线程同步2.1 最初的方式——synchronized2.1.1 同步方法块2.1.2 同步方法2.2 使单例模式变为线程安全的3. 锁——解决线程安全的方式二4. Lock与synchronized的异同5. 线程之间的通信5.1 wait()/notify()5.2
2020-10-22 08:13:58
793
1
原创 Java ThreadPoolExecutor源码解析
ThreadPoolExecutor源码解析1、常用变量的解释// 1. `ctl`,可以看做一个int类型的数字,高3位表示线程池状态,低29位表示worker数量private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));// 2. `COUNT_BITS`,`Integer.SIZE`为32,所以`COUNT_BITS`为29private static final int COUNT_BITS = Integ
2020-10-21 09:57:34
345
原创 Java注解-Annotation架构+JDK元注解+如何自定义注解
java注解1. 概述首先,注解(Annotation)是一个接口,程序可以通过反射来获取指定程序元素的java.lang.annotation.Annotation对象。然后通过这个 对象来取得注解里的元数据。只有通过某种配套的工具对注解中的信息进行访问和处理,注解才会影响程序的运行(在程序运行时起到一定的作用),否则,注解不会影响程序 的运行。访问和处理注解的工具统称为 APT(Annotation Processing Tool).2. Annotation 架构2.1 概述“每 1
2020-10-21 09:51:35
249
原创 Java泛型-泛型作用+泛型在各种数据结构中的使用+自定义泛型
文章目录1. 概念2. 为什么要使用泛型(Generic)2.1 在ArrayList中使用泛型2.2 在HashMap中使用泛型3. 自定义泛型结构3.1 泛型类与泛型接口3.2 泛型类的子类3.3 自定义泛型类/接口 仍需注意的点3.5 泛型方法1. 概念所谓泛型,就是允许在定义类、接口时通过一个标识表示类中某个属性的类型或者是某个方法的返回值及参数类型。这个类型参数将在使用时〈例如,继承或实现这个接口,用这个类型声明变量、创建对象时) 确定〈即传入实际的类型参数,也称为类型实参) 。
2020-10-21 09:49:50
493
原创 Java反射机制-反射基础+对java.lang.Class类的理解+反射应用之动态代理+SpringAOP初体验
1. 反射概述1.1 反射Reflection〈反射) 是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个class类型的对象〈一个类只有一个class对象) ,这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构,所以,我们形象的称之为: 反射。1.2 反射的作用在运行时判断任意一
2020-10-21 09:41:07
388
原创 Java I/O流-Java I/O流体系+各种I/O流的使用+File类
1. File类File类的一个对象,代表一个文件或一个文件目录File类声明在java.io 包下File类涉及到关于文件或目录的创建,删除,重命名,文件大小,修改时间,等方法,但是没有涉及到文件内容;如果需要修改,读取文件内容,必须使用io流File类的对象常会作为参数传递到io流的构造器中,指明读取或写入的“终点”。1.1 File构造器File有四个构造器,当我们new一个File时,它只是单纯的在内存层面,不会管是否存在这个文件,但我们print的时候,即:调用
2020-10-21 09:37:31
485
4
原创 Java equals() 与 == 的区别
equals() 与 == 的区别1. == 的用法:1.1 比较对象是基本类型使用 == 系统会自动进行类型强制转换,所以只需要两个变量的值相等即可。如果不能强制转换则直接报错。1.2 比较对象是引用类型当比较的两个变量是引用类型,他们必须要指向同一个实例才会返回true,也就是比较的是两个对象的内存地址。如果这两个变量没有继承关系,则会直接报错。String a = "hello";String b = "hello";System.out.println(a==b); Strin
2020-10-21 09:36:31
268
原创 Java类加载机制-java类加载过程+类加载时机+类加载器+双亲委派
文章目录Java类加载机制1.概述1.1类的加载在整个java程序运行期间处于的环节1.2类加载在JVM中处于的位置1.3类的生命周期2.从什么地方加载类3. 加载类的时机4.类加载的过程5.类加载器5.1概述5.2类加载器的种类5.3类加载机制5.3.1双亲委派(父类委托)5.3.2 双亲委派的优点5.2.3 为什么要打破双亲委派。5.2.4 怎么打破双亲委派:5.2.5 全盘负责机制:5.2.6缓冲机制:Java类加载机制类的加载是指将类加载到内存,而将 类的加载,链接,初始化这三个步骤称为 类加
2020-10-21 09:13:46
302
原创 Java网络编程
1.InetAddress进行网络通信必不可少的就是ip,在java中,万物皆对象,所以java使用InetAddress类来代表ip地址。用一个具体的InetAddress对象来代表一个ip.inetAddress 没有构造器, 一般通过静态方法:getByName 来获取它的一个实例。通过构造器来创建类的实例是java中创建对象最常用的方法,还可以通过:反射 ;调用对象的clone;反序列化;来创建对象,这里inetAddress一个是通过clone来创建对象的。InetAdd
2020-10-21 09:10:21
350
原创 浅谈JVM内存结构
JVM内存结构1.概述从大角度来看,JVM内存分为两部分,一部分为线程私有的,是我们所不能操作的,还有一部分是所有线程共享的,之后我们对JVM调优也就是调的这一部分。2.线程私有区2.1 概述线程私有部分都是一段连续的内存,速度快,但容量小,用户不可操作。下面是线程私有区的详细图。(现在里面已经有了一个math类)2.2 程序计数器一块较小的内存空间,用于标记当前线程所执行字节码的行号。这一张图片是使用javap -v 对.class文件反汇编出的,图中红色框内的就是程序计数器的标
2020-10-21 08:55:55
348
原创 异常的定义与体系结构
1. 异常的定义与体系结构1.1 定义语法错误,语意错误,不是异常。1.2结构体系异常分为两类:Error:是Java虚拟机无法解决的严重问题,比如内存溢出(OutOfMemory),StackOverflowError 等。这些都是我们无法处理的。Exception:这一类就是我们要处理的。这一类包括读取不存在的文件,网络链接中断等等等等。处理异常的时间就是在编译的时候,但是有些异常只有在运行的时候才会发生,所以我们又把异常分为运行时异常,和编译时异常。Error是属于运行时
2020-10-21 08:52:11
443
原创 深入理解ThreadLocal底层实现及其内存泄漏问题
原文链接1. ThreadLocalMapThread类中包含了一个这样的成员变量: /* ThreadLocal values pertaining to this thread. This map is maintained * by the ThreadLocal class. */ ThreadLocal.ThreadLocalMap threadLocals = null;也就是说,每一个Thread实例都有一个属于自己ThreadLocalMap,这个容器
2020-08-11 08:02:35
697
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人