- 博客(33)
- 收藏
- 关注
原创 sql 优化
测试sql语句效率的常用方法:1. 慢查询日志慢查询是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。如果不是调优需要,一般不建议启动该参数,开启慢查询日志会带来一定的性能影响。// 查看慢查询配置show VARIABLES like '%slow%'// 查看慢查询的时间阀值show VARIABLES like 'long_query_time'// 设置慢查询的时间阀
2020-08-08 10:03:44 273
原创 内存模型,JVM内存结构,垃圾回收
计算机在执行 Java 程序时,所有指令都是在 JVM 中被执行,JVM执行指令也可以看作是 cpu 处理数据,cpu处理数据是在 cpu 的高速缓存中进行的。Java 内存模型中涉及到的概念有:主内存:java虚拟机规定所有的变量都必须在主内存中产生。主内存是整个机器的内存,而虚拟机的内存是主内存中的一部分。 工作内存:java虚拟机中每个线程都有自己的工作内存,该内存是线程私有的。虚拟机规定,线程对主内存变量的修改必须在线程的工作内存中进行,不能直接读写主内存中的变量。不同的线程之间也不能相互
2020-06-06 09:39:20 214
原创 HashMap,HashSet,Hashtable,ConcurrentHashMap
HashSet: HashSet实现了Set接口,不允许集合中出现重复的元素。HashMap: HashMap实现了Map接口,Map接口对键和值进行映射,不允许出现重复的键HashMap通过散列表来存储对象,由数组+链表/红黑树的结构组成组成,数组的一个元素为一个哈希桶。存储对象时,会调用hashCode()方法计算出哈希值(int),通过对哈希值取余的方式得到哈希桶的位置,若哈希值冲突,则在每个哈希桶采用链表/红黑树结构进行存储。散列表的初始容量为16,散列...
2020-05-23 09:34:45 434
原创 操作系统——进程和线程相关
一、进程1. 概述进程是指操作系统中正在运行的一个应用程序,是拥有资源的独立单位。进程有就绪、运行和阻塞三种状态。2. PCB控制模块进程控制块PCB中记录着进程的信息,是进程存在的唯一实体。PCB中记录的信息有:进程标识符,进程的状态信息,父子进程的信息等等。3. 进程控制——用户态和内核态目的是防止用户程序访问或更改 重要的操作系统资源。说白了,对进程的权限进行限制。Linux操作系统中采用了0和3两个特权级,分别对应内核态和用户态。内核态:可以访问内存所有数据,
2021-03-30 19:37:05 215
原创 Java基础:动态加载 及 反射
1. 动态加载 及 反射在理解动态记载之前,首先要明白 Java 加载类的机制是静态加载。Java属于先编译后运行的语言,对象的类型在编译期间就已经确定下来。如下面这行创建对象的程序,在编译过程中,会生成 Student.Class 文件,在运行过程中,将Student.Class文件加载到JVM中。Student student = new Student();而动态加载是在程序运行过程中,如果某个类没有被加载过,可以在运行时动态的加载该类。先得到类的 Class 对象,再对Class对
2021-01-05 11:39:32 429
原创 TCP 和 UDP 详解
TCP和UDP都是传输层的协议,用来定义数据传输的协议。1. TCPTCP的特点是面向连接,可靠。面向连接体现在,在数据传输之前,需在客户端和服务器之间通过三次握手建立连接。数据传输完之后,需通过四次挥手断开连接。三次握手和四次挥手的过程就不展开讲了,注意理解 为什么是三次握手? 以及为什么时四次挥手?面向连接是TCP可靠性的体现之一,因为数据都是在TCP 连接上进行传输的,有效的连接能够保证传输的可靠性。可靠性的体现:1. 检验和在发送方将整个报文分为16位的段,然后将所.
2021-01-02 21:38:51 285
原创 面试中常见的大数据问题
面试中常见的大数据问题主要有:对大数据进行去重,对大数据进行排序,取大数据的TopK等等。大数据相关问题的花样数不胜数,但其根本考点是不变的——内存。碍于内存的限制,不能对大数据进行一次性全部处理,所以首先想到的是分治处理,再合并。但怎么分治,需要好好琢磨,怎么合并,也需要好好琢磨。分治法只是一种通用的方法,并不适用于所有情况。1. 大数据去重大数据去重的方案有很多,不同的题目采取的方案也会有些差异。1.1 hash分组大文件中存储着100G的 url 的数据,如何对其去重?.
2020-12-26 17:52:03 1081
原创 数据库——分库分表以及切分策略
随着业务和数据量的增长,单库的IO压力越来远大,可将单一数据库的数据分散到多个数据库中,来缓解数据库的访问压力。数据库切分的两种方式:1. 垂直切分垂直分库:根据业务的耦合程度,将关联度低的表存储在不同的数据库中。与微服务的做法相似,每个微服务使用单独的数据库。垂直分表:基于数据库中的列进行。新建一张扩展表,将不经常使用或字段长度较大的字段拆分到扩展表中。在字段很多的情况下,通过垂直分表,能避免跨页问题(MySQL底层通过数据页存储,一条数据占用空间过大会导致跨页)。另外,数据是以行
2020-12-13 16:07:13 393
原创 Redis——zset底层结构
redis中 zset 底层采用散列表+跳跃列表(skiplist)来存储数据。散列表不用多说,set 底层采用散列表来存储,value都为null,通过散列表key的唯一性保证set中元素的不重复。跳跃列表的结构:上图就是跳跃列表的示意图,图中只画了四层,Redis 的跳跃表共有 64 层,意味着最 多可以容纳 2^64 次方个元素。每一个 kv 块对应的结构如下面的代码中的 zslnode 结构,kv header 也是这个结构,只不过 value 字段是 null 值,scor
2020-12-09 16:46:34 2974 1
原创 Redis和数据库之间的数据一致性问题
Redis和数据库之间数据不一致的问题。出现的场景在高并发场景下,同时有读和写的的操作,不管是先删除缓存,再写数据库,还是先写库,再删缓存,都有可能出现数据不一致的情况。1. 如果先删除缓存,在写数据库之前,有个读数据的线程发现缓存为空,就去读取数据库,读到的是脏数据,拿脏数据更新redis缓存,导致了redis与数据库之间的数据不一致。2. 如果先写数据库,在删除缓存之前,写数据的线程宕机了,也会导致数据不一致的情况。解决方案延时双删写库前后都删除缓存一次,添加延时的目的是在写
2020-12-05 16:26:04 273
原创 锁的分类及描述
在Java中,锁的种类虽然多种多样,但其本质都在 Synchronized 及 Lock 接口的实现类。公平锁/非公平锁多个线程是否按照申请锁的顺序来获取锁,如果是,则为公平锁。ReentrantLock:可通过构造函数来设置公平锁。Synchronized:默认非公平锁,不能设置。可重入锁如果一个线程拥有锁,进入这个线程的方法或代码块不需再显式加锁,便可...
2020-12-05 15:35:49 241
原创 HashMap的优化
HashMap结构的优化HashMap的复杂度 查找/获取 添加/删除 空间 ArrayList O(1) O(N) O(N) LinkedList O(N) O(1) O(N) HashMap O(N/Buckets) O(N/Buckets) O(N) ArrayList 和 LinkedList 可以看作是HashMap的两个极端。若HashMap的所有元素都不发生哈希冲突,就变成了数组存储的Arra.
2020-11-27 14:01:29 491
原创 CPU密集型和IO密集型的多线程总结
首先要明白多线程在单核和多核CPU的运行机制:多线程在单核CPU运行时,同一时间只能处理一个线程,系统会切换线程,给每个线程分配时间片来跑。由于线程间的切换会增加系统的开销,所以多线程在多核CPU上跑时,除了能够在同一时间处理多个线程,还能避免线程间切换带来的开销。CPU密集型程序一个计算量很大的程序(也称作CPU密集型程序),多线程跑的时候,不存在阻塞的情况,可以充分利用所有的CPU的核。假如当前CPU只有四核,要使程序运行的效率最高,需使线程池的容量为4,同时跑4个线程的计算任务。如
2020-11-12 23:36:28 1353
原创 Redis进阶
Redis的过期策略redis采用的是定期删除+惰性删除策略。为什么不用定时删除?定时删除,也可以说是实时删除,用一个定时器监控key,过期则删除。虽然即使释放了内存空间,但十分消耗CPU资源。定期删除,redis默认每100ms检查是否有key过期。不是每隔100ms便将所有key检查一遍,而是随机抽取进行检查。因此,如果只采用定期删除策略,会导致很多key到时间后没有被删除。惰性删除,在获取某个key时,redis会检查这个key是否过期,如果过期了此时就会被删除。...
2020-11-07 17:04:54 129
原创 Spring Boot的自动配置原理
1. 引言Spring Boot作为目前最常用的项目配置框架,其自动配置原理可以说是精髓所在。Spring Boot自动配置的原理一般只在面试中会被问到,但作为一名框架使用者,对这种工具的原理有深入理解也是很有必要的。Spring Boot最主要的作用就是帮我们快速构建庞大的Spring项目,并且尽可能地减少一切xml配置,让我们更关注业务而非配置。2. Spring Boot的配置文件我们知道,使用Spring Boot的项目中有一个全局配置文件:application.propertie
2020-11-06 18:11:29 1233 1
原创 微服务框架之OpenFeign
1. OpenFeign是什么?在微服务架构中,Spring Cloud OpenFeign通过将OpenFeign集成到服务中的方式,为服务之间的调用提供了解决方案。OpenFeign可以做到通过HTTP请求的方式调用远程服务,就像调用本地方法一样。2. 配置OpenFeign2.1 配置pom.xmlOpenFeign的依赖包:<!--openfeign --><dependency> <groupId>org.springfra.
2020-09-18 17:02:48 431 1
原创 如何停止一个正在运行的 java 线程?
停止一个正在运行的java线程,主要有以下三种方式:1. 已废弃的 Thread.stop()stop() 的源码就不列了,这是一个自从jdk1.2开始就被废弃的方法。关于该方法的官方解释:这种方法本质上是不安全的。停止一个线程导致它解锁它锁定的所有监视器(未检查的{@code ThreadDeath}异常向上传播堆栈的自然结果)。如果以前受这些监视器保护的任何对象处于不一致的状态,其他线程就可以看到损坏的对象,这可能会导致任意行为。许多使用{@code stop}的代码应该被简单地修改一
2020-08-29 21:19:45 607
原创 HTTP协议详解
HTTP协议概述HTTP协议,超文本传输协议,是一种用于应用层的协议。HTTP是一个客户端终端和服务器端 请求和应答 的标准。通过使用网页浏览器、网络爬虫或其他工具,客户端发起一个HTTP请求到服务器上的指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。尽
2020-08-18 20:54:24 284
原创 java设计模式(三)之适配器模式
适配器的概念:将一个类的接口转换成客户期望的另一个接口。使得原本由于接口不匹配而不能一起工作的类可以一起工作。客户期望的接口A是供应接口,而提供的接口B为需求接口。适配器的适配就是指 需求“适配”供应。假如我的手机充电口是type-c类型的,但我只有一根传统的Micro USB接口的数据线,怎么办?type-c类型的接口就是需求接口,Micro USB类型的接口是供应接口,想让需求匹配供应,就需要有一个适配器。适配器的三种实现方式:1. 类适配器当需要把一个已经实现了接口A的类A
2020-07-25 14:00:09 180
原创 浅析AQS框架及实现原理
先从 Lock 讲起:Lock同步锁Lock是解决线程安全问题的常用手段,在并发包java.util.concurrent 中。Lock 是一个接口,具体方法如下:void lock(); //线程获取锁,如果锁不可用,则阻塞休眠,直到获得锁被唤醒void lockInterruptibly(); //与lock()方法类似,但阻塞的线程可中断,并抛出异常boolean tryLock(); // 非阻塞线程尝试获取锁,获取成功返回trueboolean tryLock(lo.
2020-07-23 22:38:19 219
原创 java设计模式(二)之建造者模式
介绍:建造者方法多用于创建实体对象,不通过构造方法或set方法 直接为对象的属性赋值,而是通过实体类中的 自定义内部类给对象赋值。这个自定义内部类,就叫做建造者。在该模式下,构建对象的责任交给了建造者。首先写一种建造模式的简单使用:public class ClassBean { private String className; private List<StudentBean> studentList; public ClassBean() {
2020-07-19 17:47:07 147
原创 多线程 之 TreadLocal
ThreadLocal 是一个线程内部的存储类,可以在指定线程内存储数据,数据存储后,只有在该线程能得到存储数据。该类提供线程局部变量。 这些变量与它们的正常对应物的不同之处在于,访问其中的每个线程(通过其get或set方法)具有其自己的,独立初始化的变量副本。 ThreadLocal实例通常是希望将状态与线程相关联的类中的私有静态字段(例如,用户ID或事务ID)。ThreadLocal是Thread内的局部变量,可通过为每个线程提供独立的变量副本的方式,解决变量并发访问的冲突问题。Thre
2020-07-18 09:42:44 239
原创 Java并发 之 阻塞队列LinkedBlockingQueue与ArrayBlockingQueue
常用的普通队列:ArrayList 和 LinkedList,都实现了List接口,实现的方式不同。ArrayList基于数组实现,查找时效率更高,LinkedList基于链表结构实现,insert和remove效率更高。阻塞队列相比于 普通队列最大的不同点:阻塞队列支持阻塞添加和阻塞删除。阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。 阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删除操作(可返回被删.
2020-07-10 22:15:41 196
原创 基于Servlet+Ajax+JSON 的前后端分离
这种开发模式可以称为SPA (Single Page Application 单页面应用)。这种模式下,前后端的分工明确,前端页面与服务器之间通过 Ajax引擎进行通信,Ajax引擎与服务器之间通过 json进行数据交互。相比于 JSP:这种模式将复杂度从服务器转移到了浏览器的 javascript,减轻了服务器的压力。并且 Ajax 实现了网页 异步发送请求和处理响应。1. AjaxAjax 是浏览器端的技术,依靠 js 将多种技术结合,并通过 js 实现。实质是通过js内置的 a
2020-07-03 17:49:25 372
原创 Java设计模式(一) 工厂设计模式
工厂设计模式面向接口编程,降低了实现类和应用程序之间的耦合工厂设计模式的三种形式:1.静态工厂在工厂中有一个静态方法,根据参数来决定“制造”哪种类,将创建对象的责任转移到了工厂类里。产品接口:public interface Product { public void create();}实现接口的具体产品类:public class Washer implements Product{ @Override public void create
2020-06-20 09:52:51 142
原创 Java CAS机制
什么是乐观锁,悲观锁?synchronized 是悲观锁,某个线程得到锁,其他线程只能挂起等待。 CAS 操作的是乐观锁,不需显示加锁,而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。synchronized 虽然确保了线程的安全,但是在性能上却不是最优的,synchronized 会让没有得到锁资源的线程进入 BLOCKED 状态,而后在争夺到锁资源后恢复为 RUNNABLE 状态。操作原子类:指的是 java.util.concurrent.atomic 包下,一
2020-06-14 21:40:26 157
原创 JUC 并发包及其常用类
并发包体系结构:1. CountDownLatchCountDownLatch 是一个同步工具类,用来协调多个线程之间的同步。CountDownLatch 通过计数器来实现:使一个线程在等待另外一些线程完成各自工作后,再执行。计数器初始值为线程的数量。当每一个线程完成自己任务后,就通过 countDown()方法 将计数器减1。当计数器的值减为0时,表示其他所有线程都已经完成了各自的一些任务,然后在 CountDownLatch 上等待的线程就可以恢复执行接下来的任务。方法源码:/.
2020-06-14 17:10:48 720
原创 线程池ThreadPoolExecutor构造方法详解
为什么用线程池?频繁的创建和销毁线程需要时间,会大大降低系统的效率。线程池就是一个容纳多个线程的 容器,池中的线程可以反复使用,节省了大量的时间和资源。使用线程池主要为了解决以下几个问题:通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。 对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等。创建和使用线程池:创建线程池有以下两种方法:通过 Executors 类的静态方法 通过ThreadPoolExecutor 的构造方法,自定义线程池通过看Exec..
2020-06-08 22:56:26 1253
原创 基于Collection集合完成图书管理系统
直接贴代码:主类:定义了 管理员登陆和图书管理的一系列方法import java.util.ArrayList;import java.util.Collections;import java.util.HashSet;import java.util.Scanner;public class ManageSystem { public static void main(String[] args) { Administrator p1 = new Administrator..
2020-06-07 20:32:17 478
原创 Java IO流的理解及其分类
IO流概述IO流为程序设计语言提供了程序与外部设备交互的方式。计算机通过数据线与外部设备进行交互,数据线中传输的是比特流,1bit便是一位数据。计算机中更常见的基本单位是字节,使用 8位0或1 组成的一段数据。IO流的输入还是输出,是相对于程序或者说相对于内存而言,数据从外流到内存,就是输入(读),数据从内存出去,就是输出(写)。例如,硬盘就是一种输入输出设备,硬盘可以理解为文件系统,具体的对文件系统操作的IO实现类有FileInputStream,FileOutputStream,FileRe
2020-05-30 09:33:10 279
原创 java Comparable和Comparator用法详解
1.接口的方法Comparable接口内只有一个方法:public interface Comparable<T> { public int compareTo(T o);}Comparator接口内方法挺多,具体看API文档2.比较方式Comparable用于集合内对象的自动比较,需在自定义类中重写compareTo方法。往集合内添加对象后,集合便会对其排序,一般在TreeSet集合内使用较多。举例:import java.util.TreeSet;
2020-05-27 12:12:22 181
原创 Java finally不会被执行的情况
finally语句块是必然执行的统一出口,无论是否发生异常,finally一定执行。finally中一般放置资源的释放,就算这段程序在finally之前结束了,finally也会执行 。finally语句块不会执行的两种情况:1.程序之外的原因比如软件在内存里没了,电脑关机了等2.程序内的原因:System.exit(status:0); //强制关闭程序,退出JVM...
2020-05-23 10:34:43 475
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人