自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

  • 博客(74)
  • 收藏
  • 关注

原创 Java并发编程知识点汇总

Java并发编程文章目录Java并发编程1. 几个问题1.1 什么是多线程并发编程1.2 为什么要提出多线程并发编程1.3 引入多线程并发编程会带来哪些问题1.4 多线程并发编程中的三大概念1.4.1 原子性1.4.2 可见性1.4.3 有序性2. JMM2.1 Java内存模型2.2 JMM下如何保证线程安全?2.2.1 原子性2.2.2 可见性2.2.3 有序性2.3 happen-before2.4 内存屏障2.5 volatile2.6 final保证可见性3. 锁机制3.1 CAS乐观锁3.2

2021-08-01 22:09:50 318

原创 面试常用设计Demo

面试常用设计Demo生产者消费者package sort;import java.util.ArrayList;public class ProducerConsumerTest { public static void main(String[] args) { ProductPool productPool = new ProductPool(); //线程一生成10个产品 new Thread(new Producer(produc

2021-05-13 21:32:51 431

原创 Lock锁机制原理(三)线程同步器Semaphore、CountDownLatch、CyclicBarrier

Lock锁机制原理(三)线程同步器文章目录Lock锁机制原理(三)线程同步器一、信号量Semaphore二、计数器CountDownLatch三、回环屏障CyclicBarrier小结本篇文章是lock锁系列的最后一篇,将讨论依赖于Lock锁来实现的一些线程同步器——信号量(Semaphore)、计数器(CountDownLatch)和回环屏障(CyclicBarrier)。一、信号量Semaphore概念:Semaphore是Java中的一个同步器,可以通过Semaphore来限制同步的线程个数

2021-04-25 20:31:11 379

原创 Lock锁机制原理(二)ReentrantLock和ReentrantReadWriteLock

Lock锁机制原理(二)在前面的文章中,我们已经详细地了解了Lock锁的底层实现原理,本篇文章将着眼于Lock锁的具体实现,讨论Java提供了哪些锁对象供开发者使用。一、独占锁ReentrantLock概念:ReentrantLock是可重入的独占锁,同一时刻只能有一个线程拿到锁资源,其他会进入AQS队列进行阻塞。ReentrantLock可以有两种模式:公平和非公平,这两个模式区别不大,只是在获锁的逻辑上稍有不同(一个先加入AQS队列再根据情况尝试获锁;一个直接获锁,拿不到在加入队列)。1)

2021-04-20 12:26:45 593

原创 Lock锁机制详解(一)AQS的底层实现

Lock锁机制详解(一)文章目录Lock锁机制详解(一)1、Lock锁机制存在的原因2、锁实现原理3、实现自定义锁小结参考资料在详细探讨Lock锁机制之前,首先来思考一个问题:为什么有了Synchronized还要提供Lock接口?1、Lock锁机制存在的原因1) 死锁方面虽然Java对synchronized做了许多优化,大大提升了锁的性能,但是由于Synchronized锁是无法主动释放锁资源的,因此会涉及到死锁的问题。死锁发生的四个必要条件如下:互斥不可剥夺请求与保持循环等待

2021-04-14 20:07:14 1208

原创 Synchronized深入解读

文章目录Synchronized深入解读1、实现原理2、使用细节3、锁优化小结Synchronized深入解读Synchronized在1.6之间只是重量级锁,因为会有线程的阻塞与唤醒操作,这个操作是借助操作系统的系统调用来实现的(Linux下就是利用了Pthread的mutex来实现),由于涉及到用户态到内核态上下文的切换,因此开销较大。1.6之后由于引入了大量锁优化策略,因此性能大大提升。1、实现原理每个对象都有一个monitor对象与之关联,该monitor对象在HotSpot中是C++实现的

2021-04-12 22:49:05 451

原创 Redis应用开发思维导图

2021-03-01 21:55:13 105

原创 Java读写锁的写锁降级问题

看了一些关于该问题的文章,大部分都不够清晰,这里做个总结。ReentrantLock读写锁ReentrantLock 是排他锁,同一时刻只允许一个线程访问,读写锁在同一时刻允许多个读线程访问,在写线程访问时,所有的读写线程均阻塞。读写锁维护了一个读锁和一个写锁,通过分离读写锁使并发性相比排他锁有了很大提升,适用于多读少写的场景。读写锁依赖 AQS 来实现同步功能,读写状态就是其同步器的同步状态。读写锁的自定义同步器需要在同步状态,即一个 int 变量上维护多个读线程和一个写线程的状态。读写锁将变量.

2021-02-03 21:15:00 772 4

原创 设计模式之门面模式

文章目录1、定义2、形式3、优缺点4、使用场景5、小结1、定义门面模式(Facade Pattern):门面模式又被称为外观模式,它要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。该模式提供了一个高层次的接口,使得子系统更易使用。2、形式门面模式通用类图如下所示:其中:Facade为门面角色,知晓子系统的所有功能和责任,供客户端进行调用。该角色实际为一个委托类,将客户端发出的请求委派到相应的子系统去进行处理。Subsystem为子系统角色,子系统可以同时有一个或多个,门面对于

2020-12-06 16:54:33 500

原创 设计模式之观察者模式

文章目录1、定义2、形式3、优缺点4、使用场景5、小结1、定义观察者模式(Observer Pattern):观察者模式又被称为发布订阅模式,它定义了对象间一种一对多的依赖关系,使得每当一个对象改变状态,所有依赖于它的对象都会得到通知并被自动更新。2、形式观察者模式通用类图如下所示:其中,Subject为被观察者,一般是抽象类或实现类,其定义了观察者必须实现的职责,它必须能够动态的增加、取消观察者(管理观察者并通知观察者)。Observer为观察者,观察者接收到消息后,会进行update操

2020-12-01 09:32:02 167

原创 设计模式之适配器模式

文章目录1、定义2、形式3、优缺点4、使用场景5、扩展6、小结1、定义适配器模式(Proxy Pattern):将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。2、形式通用类图如下所示:其中,Target为目标角色,是转换的目标接口Adaptee为源角色,是将被转换成目标角色的类或对象Adapter为适配器角色,定义了将源角色转换为目标角色的方式,一般通过继承或是类关联。对应代码如下:Targetpublic inter

2020-11-27 11:01:34 167

原创 设计模式之代理模式

1、定义代理模式(Proxy Pattern):为其他对象提供一种代理以控制这个对象的访问。2、形式代理模式有好几种不同的形式,下面我们针对不同的形式分别进行讲解。1)静态代理通用类图如下所示:其中Subject为抽象主题角色,定义了一个普通的业务类型,既可以是抽象类也可以是接口;RealSubject为具体主题角色,是被代理的角色,也是业务逻辑的具体执行者;Proxy为代理主题角色,负责代理真实角色,该类把所有抽象主题定义的方法限制委托给真实主题角色实现,并在真实主题角色处理完毕前后做

2020-11-21 09:41:55 115

原创 设计模式之建造者模式

1、定义建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。2、形式建造者模式通用类图如下所示:类图中各类含义为:Product为产品类,通常是实现了模板方法模式的类。Builder为抽象建造者,由其子类去实现实际产品的组建。ConcreteBuilder为具体建造者,实现抽象类定义的所有方法,并返回一个组建好的对象。Director为导演类,负责安排已有模块的顺序,然后告诉Builder开始建造。通用源码如下:Pro

2020-11-16 11:25:44 78

原创 设计模式之模板方法模式

1、定义模板方法模式(Template Method Pattern):定义一个操作中的算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变一个算法的结构即可冲定义该算法的某些特定步骤。2、形式模板方式模式的通用类图如下所示:类图比较简单,仅仅使用了继承机制。其中,AbstractClass为抽象模板,包含了两类方法:基本方法:由子类实现的方法,并在模板方法被调用模板方法:可以有一至多个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度以完成固定的逻辑。ConcreteCl

2020-11-14 11:00:20 103

原创 设计模式之抽象工厂模式

1、定义抽象工厂模式(Abstract Factory Pattern):为创建一组相关或相互依赖的对象提供一个接口,并且无需指定它们的具体类。2、形式抽象工厂模式通用类图如下所示:从类图上来看该模式跟工厂模式似乎没有差别,但抽象工厂模式实际上是工厂模式的升级版。在存在多个业务品种、业务分类时,通过抽象工厂模式产生需要的对象是一种非常好的解决方式。抽象工厂一般都定义了多个工厂类去管理同一类业务对象,精化后的类图如下:对应的通用源码为:AbstractProductApublic abst

2020-11-10 11:03:55 306

原创 设计模式之工厂方法模式

1、定义工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。2、形式工厂方法模式的通用类图如下所示:上图中各类和接口的含义为:抽象产品类Product负责定义产品的共性,实现对事物最抽象的定义抽象创建类Creator即为抽象工厂具体创建类ConcreteCreator为具体的实际工厂一个通用的模板代码如下:Productpublic abstract class Product { //产品类的公共方法 publ

2020-11-04 22:01:54 1297

原创 设计模式之单例模式

文章目录1、定义2、形式3、优缺点4、使用场景5、扩展小结1、定义单例模式(Singleton Pattern):确保某一个类只有一个实例,自行实例化并向整个系统提供这个实例。2、形式单例模式分为懒汉式和饿汉式两种,形式如下所述。饿汉式通用类图和代码如下所示:public class Singleton { private static final Singleton singleton = new Singleton(); private Singleton(){}

2020-11-03 18:35:26 168

原创 面向对象六大原则

1、单一职责原则英文名称:Single Responsibility Principle(SRP)基本定义:应该有且仅有一个原因引起类的变更。示例:对于常见的管理系统来说,一定会涉及到角色管理模块,针对于用户信息维护这一功能,一个糟糕的接口设计如下:好处:2、里氏替换原则3、依赖倒置原则4、接口隔离原则5、迪米特法则6、开闭原则...

2020-11-01 16:19:20 1369

原创 SSM框架整合

文章目录SSM框架整合1、搭建数据库2、项目环境搭建3、搭建项目框架4、Mybatis层编写5、整合Spring层6、整合SpringMVC7、Controller处理层和视图层结果展示SSM框架整合1、搭建数据库ssmbuild.sqlCREATE DATABASE `ssmbuild`;USE `ssmbuild`;CREATE TABLE `books` ( `bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id', `bookNa

2020-10-07 10:45:56 100

原创 SpringBoot原理概述

文章目录一、SpringBoot概述二、运行原理剖析三、配置与使用四、一个简单地Web应用一、SpringBoot概述二、运行原理剖析三、配置与使用四、一个简单地Web应用

2020-10-06 12:13:25 7965 5

原创 Model checking Part IV

文章目录第五章 CTL模型检测5.1 显示状态CTL模型检测5.2 具有公平性约束的CTL模型检测5.3 基于定点计算的CTL模型检测5.3.1 不动点理论的背景5.3.2 基于不动点的可达性分析5.3.3 基于不动点的CTL模型检测算法5.3.4 用不动点描述公平5.3.5 有限路径上的定点表征第五章 CTL模型检测概念:给定Kripke结构M =(AP,S,R,S0,L)表示有限状态系统和CTL公式f表示一些期望的规范,确定M是否是f的模型,即M╞ f。(或表示为找到M中满足f状态的集合:注:

2020-09-18 10:32:58 678 1

原创 常见数据结构与算法汇总(不断更新)

文章目录一、数据结构部分1、线性表1.1 数组1.2 链表2、栈和队列3、树二叉树二叉搜索树平衡二叉树红黑树4、图二、常见算法1、回溯2、递归3、滑动窗口4、分治法5、动态规划6、贪心算法7、查找算法8、排序算法一、数据结构部分1、线性表1.1 数组创建数组//以int型为例//创建指定大小的数组int[] nums = new int[len];//创建多维数组第一个方括号内的数量不可缺失,因为必须为数组分配指定大小的内存。int[][] nums1 = new int[len][];

2020-09-14 09:37:40 1985

原创 SpringMVC学习

文章目录一、SpringMVC概述二、实现原理1、开发流程2、控制器管理方式3、具体实例三、实现细节1、Controller和RestFul风格ControllerRestful风格2、视图跳转方式3、数据处理操作四、扩展知识1、JSON数据格式1) 概述2) 前后端JSON数据传递2、Ajax五、常用功能实现1、过滤器2、拦截器3、文件上传和下载一、SpringMVC概述SpringMVC是一个基于java实现MVC的轻量级Web框架。从下面给出的官方描述可以看出,该框架的设计围绕着Dispatche

2020-09-09 22:19:28 277

原创 Leetcode解题思路

1、理解题意读懂题目要求:要实现什么功能案例分析注意限制条件(时间复杂度、空间复杂度)2、单步运行这一步以数据结构和常用算法的掌握为前提,需要通过大量刷题来提升解题的敏感度。生成解题思路分析基本示例考虑常用的算法思路筛选出符合题意的算法思路3、抽象化抽象化算法行为分析给出的算法为什么符合题意4、编码这一步建立在掌握对应语言和API的基础上,是从‘抽象到具体’的过程。将算法的行为具体化成实际代码得到初始代码5、测试考虑以下情况:边界条件数组越

2020-09-06 19:45:02 242

原创 Spring框架学习

文章目录一、Spring概述二、IOC1、概述2、第一个Spring程序3、Bean的创建4、依赖注入5、Bean的自动装配6、注解开发7、基于java类进行配置8、Bean的作用域和生命周期三、AOP1、代理模式2、概述3、AOP实现四、整合Mybatis1、Mybatis-Spring2、案例实践3、事务管理一、Spring概述概念:Spring是一个轻量级的开源框架,是一个具有控制反转(IOC)和面向切片编程(AOP)特点的容器。组成:Spring Core:核心容器提供 Spring 框架

2020-08-19 18:20:15 128

原创 二维数组的深克隆

今天在写一道算法题时,发现二维数组使用clone和arraycopy两种方法进行数组复制只能实现浅克隆。起初有点疑惑,但仔细思考了一下这两种方式的实现原理就能明白其中的原因。首先,这两种方式都会对基本类型的值进行赋值,但是对于引用变量来说,它们也仅仅只是将引用的变量的‘值’克隆一份,也就是引用变量的地址。因此对于二维数组来说,其实际为一个元素值为一维数组地址的一维数组,故在使用上述方法克隆数组时,新的二维数组仅仅只将原有的一维引用地址复制了一份。那么如何实现多维数组间的深克隆呢?有两种方式:多次遍历

2020-08-11 10:47:56 882

原创 Java Web小结

文章目录一、HTTP消息请求和响应二、Servlet1、HTTPServlet2、ServletContext3、获取初始化参数3、请求转发4、读取资源文件三、HTTPServletResponse1、类结构分析2、常见功能实现3、重定向四、HTTPServletRequest四、Cookie和Session1、会话2、Cookie3、Session五、JSP1、JSP原理2、JSP基础语法3、JSP指令4、9大内置对象六、MVC七、过滤器八、监听器扩展小结一、HTTP概念:超文本传输协议,是一个简单的

2020-08-09 17:59:22 185

原创 Model checking Part III

文章目录第四章 时态逻辑4.1 计算树逻辑CTL*4.2 CTL* 的语法和语义4.2.1 CTL* 语法4.2.2 CTL* 语义4.2.3 否定范式(NFF)4.3 基于CTL* 的时态逻辑4.3.1 分支时间逻辑CTL4.3.2 通用计算树逻辑ACTL* 和ACTL1. ACTL*2. ACTL4.3.3 线性时间逻辑(LTL)4.3.4 CTL* 各部分间的关系4.4 集合原子命题与集合语义的时态逻辑4.5 公平4.6 反例4.7 安全性和活跃性第四章 时态逻辑概念:时态逻辑是用于指定系统动态行

2020-08-07 10:59:54 611

原创 Mybatis学习

文章目录一、概述二、环境准备1、导入MyBatis相关jar包2、编写核心配置文件3、编写MyBatis工具类三、配置解析1、environments元素2、mappers元素3、Properties元素4、typeAliases元素5、settings元素6、typeHandlers元素7、objectFactory元素8、插件9、databaseIdProvider元素四、基本操作1、select五、注解开发六、ResultMap七、分页实现八、多表查询九、动态SQL十、缓存小结一、概述MyBati

2020-08-05 11:27:16 120

原创 MySQL概述

文章目录一、概述二、数据库操作1、DDL2、DML3、DQL4、DCL三、MySQL函数四、事务五、索引六、数据库管理七、数据库设计八、JDBC小结一、概述什么是数据库?数据库是一个长期存放在计算机内,有组织可共享的大量数据集合,是一个数据仓库。数据库能够保存并管理数据,一般分为两种:关系型数据库(SQL):通过外键关联建立表与表之间的关系。MySQL、Oracle、SQL server…非关系型数据库(NoSQL):数据以对象的形式存储在数据库中,对象之间的关系通过每个对象自身属性来决定。

2020-08-01 09:13:41 285

原创 LeetCode21 合并两个有序链表

遍历法/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListNode(int val, ListNode next) { this.val = val; this.next = next; }.

2020-07-30 10:56:35 68

原创 Model checking Part II

文章目录第三章 系统建模相关概念本章主要内容:3.1 转换系统和kripke结构转换系统kripke结构3.2 不确定性与输入3.3一阶逻辑和符号表示3.4 布尔编码3.5 数字电路建模3.5.1 状态保持元素3.5.2 同步电路3.5.3 异步电路3.6 程序建模3.6.1 顺序进程3.6.2 并发进程建模3.7 公平第三章 系统建模相关概念需求工程:指定系统应具有的属性,并了解在哪个抽象级别可以评估这些属性的真实性或虚假性。构建形式化模型(1)捕获影响属性正确性的系统方面(2)抽象出

2020-07-11 22:23:39 409

原创 Leetcode 20 有效的括号

问题描述:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足1)左括号必须用相同类型的右括号闭合2)左括号必须以正确的顺序闭合3)空字符例:输入: “()”输出: true思路:简单题,直接使用栈,左括号直接入栈,遇到右括号时判断括号是否匹配,匹配则将栈顶元素出栈,继续匹配;否则失败。class Solution { public boolean isValid(String s) { if(s == nu

2020-07-08 18:47:44 97

原创 Model checking Part I

Model Checking文章目录Model Checking序言可靠系统开发过程中的主要挑战—设计验证问题(design validation)现有实践方法—模拟和测试(simulation and tesing)本书主题:取代现有的方法—形式验证(formal verification)本书焦点:形式验证方法中的其中一种—模型检测(model checking)第一章:第一版简介模型检测的历史模型检测的现状第二版介绍第二章:第二版简介模型检测本章主要内容2.1 形式化方法的必要性2.2 硬件和软件检

2020-07-06 21:31:08 486 3

原创 Maven工程中整合jacoco和sonar

文章目录一、jacoco配置使用1、概述2、Maven中导入插件3、案例测试4、注意事项二、sonar配置使用一、jacoco配置使用1、概述jacoco是一个计算测试对应代码覆盖率的测试工具,会计算以下几个指标:行覆盖率:执行代码行数 / 总代码行数,判断有多少行代码被测试执行;类覆盖率:执行的类 / 代码中类总个数;分支覆盖率:执行的逻辑分支数 / 总的分支数,一般用于检测是不是lf/else都有测试覆盖;方法覆盖率:执行的方法数 / 代码总方法数,检测是否有方法被遗漏,构造方法也看作为

2020-07-05 17:54:15 1423

原创 Leetcode19 删除链表的倒数第N个节点

问题描述:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.思想:双指针比较容易想到双指针解法,设置两个指针间隔为n,当后一个指针到达尾结点,表示前一个节点到达所要删除的位置,把该节点的后指针指向原后节点的后一节点即可。回溯法通过递归先遍历到最深,在回溯的时候通过计数找到目标指针,修改指针的指向。/

2020-07-01 09:55:55 103

原创 volatile概念详解及使用场景

概念详解使用场景

2020-07-01 09:55:17 1931

原创 Leetcode17 电话号码的数字组合

问题描述:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].思考:可以看出,输入一个数字,有3种结果;输入2个数字,有32种结果;归纳可得对于n (0<n<9) 个数字来说,输出应该有3n个结果。显然简单的循环(nk)无法满足这一要求,容易联想到树结构,完全树的第

2020-06-30 17:38:35 169

原创 IDEA创建Maven项目 利用Junit进行单元测试

文章目录一、构建Maven项目1、新建maven项目:File->New->Project2、输入GroupId和ArtifactId(前者定义项目组,后者定义项目名称)3、配置Maven4、finish,项目骨架如下5、完善项目骨架二、利用Junit进行单元测试1、加载插件Setting->Plugins2、Junit配置3、测试一、构建Maven项目1、新建maven项目:File->New->Project2、输入GroupId和ArtifactId(前者定义项目

2020-06-29 14:35:25 3321

原创 初识JVM

文章目录一、JVM的体系结构二、类加载机制三、各区域介绍1、native方法(本地方法接口、本地方法)2、程序计数器3、方法区4、栈5、堆堆内存调优四、Dump内存快照五、GC详解一、JVM的体系结构在了解JVM的体系结构之前,我们需要知道它在整个系统中的位置。如下图所示,JVM是运行在操作系统之上的,与硬件没有直接的交互(但可以通过本地方法调用间接实现对硬件的控制)。接下来我们详细考虑JVM的体系结构,将上图中的JVM层剖析开来,可以分解为以下几个结构:类加载器、运行时数据区(方法区(元空间)、J

2020-06-29 14:31:11 255

空空如也

空空如也

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

TA关注的人

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