自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 内存模型,JVM内存结构,垃圾回收

计算机在执行 Java 程序时,所有指令都是在 JVM 中被执行,JVM执行指令也可以看作是 cpu 处理数据,cpu处理数据是在 cpu 的高速缓存中进行的。Java 内存模型中涉及到的概念有:主内存:java虚拟机规定所有的变量都必须在主内存中产生。主内存是整个机器的内存,而虚拟机的内存是主内存中的一部分。 工作内存:java虚拟机中每个线程都有自己的工作内存,该内存是线程私有的。虚拟机规定,线程对主内存变量的修改必须在线程的工作内存中进行,不能直接读写主内存中的变量。不同的线程之间也不能相互

2020-06-06 09:39:20 115

原创 HashMap,HashSet,Hashtable,ConcurrentHashMap

HashSet: HashSet实现了Set接口,不允许集合中出现重复的元素。HashMap: HashMap实现了Map接口,Map接口对键和值进行映射,不允许出现重复的键HashMap通过散列表来存储对象,由数组+链表/红黑树的结构组成组成,数组的一个元素为一个哈希桶。存储对象时,会调用hashCode()方法计算出哈希值(int),通过对哈希值取余的方式得到哈希桶的位置,若哈希值冲突,则在每个哈希桶采用链表/红黑树结构进行存储。散列表的初始容量为16,散列...

2020-05-23 09:34:45 149

原创 Redis和数据库之间的数据一致性问题

Redis和数据库之间数据不一致的问题。出现的场景在高并发场景下,同时有读和写的的操作,不管是先删除缓存,再写数据库,还是先写库,再删缓存,都有可能出现数据不一致的情况。1. 如果先删除缓存,在写数据库之前,有个读数据的线程发现缓存为空,就去读取数据库,读到的是脏数据,拿脏数据更新redis缓存,导致了redis与数据库之间的数据不一致。2. 如果先写数据库,在删除缓存之前,写数据的线程宕机了,也会导致数据不一致的情况。解决方案延时双删写库前后都删除缓存一次,添加延时的目的是在写

2020-12-05 16:26:04 1

原创 锁的分类及描述

在Java中,锁的种类虽然多种多样,但其本质都在 Synchronized 及 Lock 接口的实现类。公平锁/非公平锁多个线程是否按照申请锁的顺序来获取锁,如果是,则为公平锁。ReentrantLock:可通过构造函数来设置公平锁。Synchronized:默认非公平锁,不能设置。可重入锁如果一个线程拥有锁,进入这个线程的方法或代码块不需再显式加锁,便可...

2020-12-05 15:35:49

原创 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 3

原创 CPU密集型和IO密集型的多线程总结

首先要明白多线程在单核和多核CPU的运行机制:多线程在单核CPU运行时,同一时间只能处理一个线程,系统会切换线程,给每个线程分配时间片来跑。由于线程间的切换会增加系统的开销,所以多线程在多核CPU上跑时,除了能够在同一时间处理多个线程,还能避免线程间切换带来的开销。CPU密集型程序一个计算量很大的程序(也称作CPU密集型程序),多线程跑的时候,不存在阻塞的情况,可以充分利用所有的CPU的核。假如当前CPU只有四核,要使程序运行的效率最高,需使线程池的容量为4,同时跑4个线程的计算任务。如

2020-11-12 23:36:28 16

原创 Redis进阶

Redis的过期策略redis采用的是定期删除+惰性删除策略。为什么不用定时删除?定时删除,也可以说是实时删除,用一个定时器监控key,过期则删除。虽然即使释放了内存空间,但十分消耗CPU资源。定期删除,redis默认每100ms检查是否有key过期。不是每隔100ms便将所有key检查一遍,而是随机抽取进行检查。因此,如果只采用定期删除策略,会导致很多key到时间后没有被删除。惰性删除,在获取某个key时,redis会检查这个key是否过期,如果过期了此时就会被删除。...

2020-11-07 17:04:54 7

原创 Spring Boot的自动配置原理

1. 引言Spring Boot作为目前最常用的项目配置框架,其自动配置原理可以说是精髓所在。Spring Boot自动配置的原理一般只在面试中会被问到,但作为一名框架使用者,对这种工具的原理有深入理解也是很有必要的。Spring Boot最主要的作用就是帮我们快速构建庞大的Spring项目,并且尽可能地减少一切xml配置,让我们更关注业务而非配置。2. Spring Boot的配置文件我们知道,使用Spring Boot的项目中有一个全局配置文件:application.propertie

2020-11-06 18:11:29 57

原创 Redis基础及认识

Redis是什么?随着Web应用访问量和并发量的提升,关系型数据库在性能上出现了一些瓶颈,瓶颈的源头便是磁盘的I/O。为了克服这一缺点,NoSQL应运而生,它同时具备了高性能、扩展性强、高可用等优点。Redis是现在最受欢迎的NoSQL数据库之一,其具备以下特性:基于内存运行,性能高效 支持分布式,可扩展行强 ...

2020-10-15 22:30:24 14

原创 微服务框架之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 64

原创 如何停止一个正在运行的 java 线程?

停止一个正在运行的java线程,主要有以下三种方式:1. 已废弃的 Thread.stop()stop() 的源码就不列了,这是一个自从jdk1.2开始就被废弃的方法。关于该方法的官方解释:这种方法本质上是不安全的。停止一个线程导致它解锁它锁定的所有监视器(未检查的{@code ThreadDeath}异常向上传播堆栈的自然结果)。如果以前受这些监视器保护的任何对象处于不一致的状态,其他线程就可以看到损坏的对象,这可能会导致任意行为。许多使用{@code stop}的代码应该被简单地修改一

2020-08-29 21:19:45 65

原创 HTTP协议详解

HTTP协议概述HTTP协议,超文本传输协议,是一种用于应用层的协议。HTTP是一个客户端终端和服务器端 请求和应答 的标准。通过使用网页浏览器、网络爬虫或其他工具,客户端发起一个HTTP请求到服务器上的指定端口(默认端口为80)。我们称这个客户端为用户代理程序(user agent)。应答的服务器上存储着一些资源,比如HTML文件和图像。我们称这个应答服务器为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。尽

2020-08-18 20:54:24 49

原创 Spring Boot 视图解析器详解

首先看一下Spring Boot中mvc的自动配置类 WebMvcAutoConfiguration,其中有一个内部类 WebMvcAutoConfigurationAdapter,是Spring Boot 自动化配置mvc的关键类。在WebMvcAutoConfigurationAdapter 中找到视图解析器 defaultViewResolver :@Bean@ConditionalOnMissingBeanpublic InternalResourceViewResolver defau.

2020-08-14 18:18:02 139

原创 sql 优化

测试sql语句效率的常用方法:1. 慢查询日志慢查询是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句。默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。如果不是调优需要,一般不建议启动该参数,开启慢查询日志会带来一定的性能影响。// 查看慢查询配置show VARIABLES like '%slow%'// 查看慢查询的时间阀值show VARIABLES like 'long_query_time'// 设置慢查询的时间阀

2020-08-08 10:03:44 70

原创 MySQL索引底层原理

当系统的业务数据量不断增多,sql的执行效率对系统效率的影响越来越大,优化sql语句就显得很有必要。

2020-08-01 09:46:13 75

原创 java设计模式(二)之适配器模式

适配器的概念:将一个类的接口转换成客户期望的另一个接口。使得原本由于接口不匹配而不能一起工作的类可以一起工作。客户期望的接口A是供应接口,而提供的接口B为需求接口。适配器的适配就是指 需求“适配”供应。假如我的手机充电口是type-c类型的,但我只有一根传统的Micro USB接口的数据线,怎么办?type-c类型的接口就是需求接口,Micro USB类型的接口是供应接口,想让需求匹配供应,就需要有一个适配器。适配器的三种实现方式:1. 类适配器当需要把一个已经实现了接口A的类A

2020-07-25 14:00:09 44

原创 浅析AQS框架及实现原理

先从 Lock 讲起:Lock同步锁Lock是解决线程安全问题的常用手段,在并发包java.util.concurrent 中。Lock 是一个接口,具体方法如下:void lock(); //线程获取锁,如果锁不可用,则阻塞休眠,直到获得锁被唤醒void lockInterruptibly(); //与lock()方法类似,但阻塞的线程可中断,并抛出异常boolean tryLock(); // 非阻塞线程尝试获取锁,获取成功返回trueboolean tryLock(lo.

2020-07-23 22:38:19 45

原创 java设计模式(一)之建造者模式

介绍:建造者方法多用于创建实体对象,不通过构造方法或set方法 直接为对象的属性赋值,而是通过实体类中的 自定义内部类给对象赋值。这个自定义内部类,就叫做建造者。在该模式下,构建对象的责任交给了建造者。首先写一种建造模式的简单使用:public class ClassBean { private String className; private List<StudentBean> studentList; public ClassBean() {

2020-07-19 17:47:07 25

原创 多线程 之 TreadLocal

ThreadLocal 是一个线程内部的存储类,可以在指定线程内存储数据,数据存储后,只有在该线程能得到存储数据。该类提供线程局部变量。 这些变量与它们的正常对应物的不同之处在于,访问其中的每个线程(通过其get或set方法)具有其自己的,独立初始化的变量副本。 ThreadLocal实例通常是希望将状态与线程相关联的类中的私有静态字段(例如,用户ID或事务ID)。ThreadLocal是Thread内的局部变量,可通过为每个线程提供独立的变量副本的方式,解决变量并发访问的冲突问题。Thre

2020-07-18 09:42:44 40

原创 通过栈结构使单向链表反向

用List来模拟 栈结构,并提供push()和pop()方法实现栈的先进后出特性:public class Stack { private List<ListNode> list; public Stack() { list = new ArrayList<>(); } public ListNode getLastNode(){ return list.get(list.size()-1); }

2020-07-16 17:19:49 35

原创 Java并发 之 阻塞队列LinkedBlockingQueue与ArrayBlockingQueue

常用的普通队列:ArrayList 和 LinkedList,都实现了List接口,实现的方式不同。ArrayList基于数组实现,查找时效率更高,LinkedList基于链表结构实现,insert和remove效率更高。阻塞队列相比于 普通队列最大的不同点:阻塞队列支持阻塞添加和阻塞删除。阻塞添加是指当阻塞队列元素已满时,队列会阻塞加入元素的线程,直队列元素不满时才重新唤醒线程执行元素加入操作。 阻塞删除是指在队列元素为空时,删除队列元素的线程将被阻塞,直到队列不为空再执行删除操作(可返回被删.

2020-07-10 22:15:41 34

原创 基于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 104

原创 Java 设计模式之 工厂设计模式

工厂设计模式面向接口编程,降低了实现类和应用程序之间的耦合工厂设计模式的三种形式:1.静态工厂在工厂中有一个静态方法,根据参数来决定“制造”哪种类,将创建对象的责任转移到了工厂类里。产品接口:public interface Product { public void create();}实现接口的具体产品类:public class Washer implements Product{ @Override public void create

2020-06-20 09:52:51 65

原创 Java CAS机制

什么是乐观锁,悲观锁?synchronized 是悲观锁,某个线程得到锁,其他线程只能挂起等待。 CAS 操作的是乐观锁,不需显示加锁,而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。synchronized 虽然确保了线程的安全,但是在性能上却不是最优的,synchronized 会让没有得到锁资源的线程进入 BLOCKED 状态,而后在争夺到锁资源后恢复为 RUNNABLE 状态。操作原子类:指的是 java.util.concurrent.atomic 包下,一

2020-06-14 21:40:26 58

原创 Java 并发包及其常用类

并发包体系结构:1. CountDownLatchCountDownLatch 是一个同步工具类,用来协调多个线程之间的同步。CountDownLatch 通过计数器来实现:使一个线程在等待另外一些线程完成各自工作后,再执行。计数器初始值为线程的数量。当每一个线程完成自己任务后,就通过 countDown()方法 将计数器减1。当计数器的值减为0时,表示其他所有线程都已经完成了各自的一些任务,然后在 CountDownLatch 上等待的线程就可以恢复执行接下来的任务。方法源码:/.

2020-06-14 17:10:48 156

原创 线程池ThreadPoolExecutor构造方法详解

为什么用线程池?频繁的创建和销毁线程需要时间,会大大降低系统的效率。线程池就是一个容纳多个线程的 容器,池中的线程可以反复使用,节省了大量的时间和资源。使用线程池主要为了解决以下几个问题:通过重用线程池中的线程,来减少每个线程创建和销毁的性能开销。 对线程进行一些维护和管理,比如定时开始,周期执行,并发数控制等等。创建和使用线程池:创建线程池有以下两种方法:通过 Executors 类的静态方法 通过ThreadPoolExecutor 的构造方法,自定义线程池通过看Exec..

2020-06-08 22:56:26 42

原创 基于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 224

原创 Java IO流的理解及其分类

IO流概述IO流为程序设计语言提供了程序与外部设备交互的方式。计算机通过数据线与外部设备进行交互,数据线中传输的是比特流,1bit便是一位数据。计算机中更常见的基本单位是字节,使用 8位0或1 组成的一段数据。IO流的输入还是输出,是相对于程序或者说相对于内存而言,数据从外流到内存,就是输入(读),数据从内存出去,就是输出(写)。例如,硬盘就是一种输入输出设备,硬盘可以理解为文件系统,具体的对文件系统操作的IO实现类有FileInputStream,FileOutputStream,FileRe

2020-05-30 09:33:10 130

原创 Java 创建线程池对象的细节及参数分析

创建线程池创建线程池通过Executors类的方法来创建线程池实例ExecutorService service = Executors.newCachedThreadPool(); //创建缓存线程池实际上Executors创建的线程池对象最终都是通过实例化配置不同参数的ThreadPoolExecutor对象public static ExecutorService newCachedThreadPool() { return new ThreadPoolEx...

2020-05-29 22:04:38 73

原创 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 53

原创 java 模拟用户登录

使用集合存储多个用户对象。 录入用户和密码,对比用户信息,模拟用户登录。//初始版本,单纯的对比对象的属性,简单粗暴/***程序入口*/public class Test { public static void main(String[] args) { User p1 = new User("张三","1213"); User p2 = new User("李四","1113"); User p3 = new User("王二","2223"); ArrayLis

2020-05-23 15:31:17 152

原创 Java finally不会被执行的情况

finally语句块是必然执行的统一出口,无论是否发生异常,finally一定执行。finally中一般放置资源的释放,就算这段程序在finally之前结束了,finally也会执行 。finally语句块不会执行的两种情况:1.程序之外的原因比如软件在内存里没了,电脑关机了等2.程序内的原因:System.exit(status:0); //强制关闭程序,退出JVM...

2020-05-23 10:34:43 122

空空如也

空空如也

空空如也

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

TA关注的人 TA的粉丝

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