自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 认识JVM虚拟机

JVM是什么JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字...

2020-03-25 12:22:58 424

原创 HashMap继续解读

HashMap大家应该都知道,有什么特点,怎么存储数据,底层数据结构,JDK1.7数组+链表,JDK1.8数组+链表+红黑树。今天来深刻学习一下HashMap源码。HashMap中的数组(桶)看一下源码中怎么定义它的 Node数组也叫做桶 transient Node<K,V>[] table;定义了一个Node类型的数组对象。再看一下它的构造方法创建桶 ...

2020-03-22 22:05:53 326 1

转载 红黑树算法原理

原文:红黑树深入剖析及Ja...

2020-02-01 14:15:04 151

原创 Lifecycle(生命周期)、Pipeline和Valve

参考:Tomcat架构解析单工程架构则已经远远不能满足现有业务需求了。所以在这种情况下,淘宝在13年开启了插件化架构的重构,后来在14年迎来了手机淘宝有史以来最大规模的重构,将项目重构为组件化架构。在tomcat中各种容器也就是着各种组件的形式进行设计。所有的组件均存在启动、定制等生命周期方法,拥有生命周期管理的特性,然后根据组件的这一特点抽象一个Lifecycle通用接口,Lifecycle接口核心方法init():初始化组件。start():启动组件。stop():停止组件。desto

2020-09-03 23:19:31 280

原创 Tomcat-Connector(链接器)

参考:Tomcat架构解析后面会对这些进行排版,整理,总结,修改等。Tomcat服务器Server两大组件Container和Connector前面已经介绍了Container(容器)Connector设计要想与container配合实现一个完整的服务器功能,Connector至少要完成下面几项功能。监听服务器端口,读取来自客户端的请求。将请求数据按照指定协议进行解析。根据请求地址匹配正确的容器进行处理。将响应返回客户端。只有这样才能保证将接收到的客户端请求交由与请求地址匹配的容器处理。

2020-09-03 23:18:05 260

原创 Tomcat-Container(容器)

参考:Tomcat架构解析未修订版ContainerContainer负责具体请求。有start()和stop()方法来加载和释放自己维护的资源。在tomcat中,Container是一个通用的概念,然后tomcat将container重新命名Engine,表示整个servlet引擎。Engine表示整个Servlet引擎,而非servlet容器,表示整个Servlet容器的是Server。引擎只负责请求的处理,并不需要考虑请求链接、协议等处理。容器的设计一个Servlet包含多个Serv

2020-09-03 17:03:53 751

原创 Tomcat架构模型

因为数据库数据丢失了,这个博客我本来是打算放弃了,这段时间搬砖,啥也没干。。之前打算做个主从同步,然后一台腾讯云去安装两个mysql好像挺麻烦的,也就没去干。实际操作,就只是去修改一下binlog就可以了。但是还是打算学点东西,记录一下。我考虑我还是先发布,最起码有点虚荣感或者说成就感,啊哈哈哈,未修改版本,后面会有重新整理,然后修订,再去掉这句话参考:Tomcat架构解析直接来看一下URL图把,这里其实很多都忘记了,就先简单介绍一下每个类的功能。Server(服务器)接收其他计算机(客户

2020-09-03 16:58:12 278

原创 23天数据库空了。

之前就是这个halo,是别人写好的jar,有具体的部署方法,跟着来,然后就在服务器上发布了,记了好多东西,然后心痛。没有备案,binlog也没有开启。直接就是恢复不了了。Linux上yum安装方式wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpmyum -y install mysql57-community-release-el7-10.noarch.rpmyum -y install

2020-08-18 22:03:41 101

原创 poi+项目部署

收到任务,练手demo,没有做过,来讲一下实现和bug记录。搭建spring boot + mybatis框架,并在此框架下对用户信息表进行增删改查,excel表格导入与导出。要求:页面自选框架或者jsp写,表结构自己设计创建,部署在linux环境下,容器用tomcat。时间:三天主要是使用啥工具吧:poi <dependency> <groupId>org.apache.poi</groupId>

2020-07-17 17:28:12 401

原创 图解HTTP(HTTP协议)

来源:图解HTTP。HTTP协议用于客户端和服务器之间的通信两台计算机之间使用HTTP协议通信时,在一条通信路线上必定有一段是客户端,另一端则是服务端。HTTP协议规定,请求从客户端发出,最后服务器端响应该请求并返回。客户端发送请求:HTTP/1.0和 HTTP/1.1支持的方法。服务器接收请求,并返回结果:HTTP不保存状态HTTP是一种不保存状态,无状态协议。HTTP协议自身不对请求和响应之间的通信状态进行保存(不做持久化处理)。HTTP/1.1虽然是无

2020-07-02 18:50:51 208

原创 图解HTTP(TCP/IP)

TCP/IP的分层管理分为:应用层,传输层,网络层,数据链路层。优势:互联网只由一个协议统筹,某个地方需要改变设计时,就必须把所有整体替换掉。而分层之后只需把变动的层替换掉即可。把各层之间的接口部分规划好之后每个层次内部的设计就能够自由改动了。应用层:决定了向用户提供服务时通信的活动。TCP/IP协议族内预存了各类通用的应用服务。FTP(File Transfer Protocol,文本传输协议)和DNS(Domain Name System,域名系统)服务就是其中两类HTTP协议也处于该层。

2020-07-02 16:58:41 383

原创 语法糖Stream流

小作文:应届生(大四狗)。学习Java之路完全自学,没有报个班的想法。简历(秋招错过了,没有找到实习,这次春招估计也凉凉)技能(简单的后台管理系统,前端方面(书写一些简单的页面)能够上手与后端服务建立连接。)前一段时间疫情(4月份之前),在一个没有啥娱乐活动的地方悠闲学习(斗志昂扬),备战春招、投简历、等面试,等呀等,没有机会面试,简历初筛就pass了。4月初,回了荆州老家,朋友们没有出门(我也在家里),就约着麻将,篮球,宵夜,毫无心思学习,之前学习的计划也中断了,博客也没有更新。这次就对之前的

2020-06-22 17:16:54 394

原创 MySQL事务模块

本文档题目来自MySQL纯手写面试笔记解析,2020锤爆35K月薪,你值得拥有闲谈:可能还是自己怂吧。或者说实例不够,一直以来不善记忆,全凭理解,理解不了的当然也记不住,累了累了。事务是什么?事务有哪些特性?MySQL 中有几种事务隔离级别?分别是什么?幻读和不可重复读的区别?并发事务一般有哪些问题?并发事务有什么什么问题?应该如何解决?什么是 MVCC?MVCC 是怎么工作的?REPEATABLE READ(可重读)隔离级别下 MVCC 如何工作?MySQL 事务实现原理是什么?如

2020-06-22 17:12:15 172

原创 MySQL索引模块

本文档题目来自MySQL纯手写面试笔记解析,2020锤爆35K月薪,你值得拥有什么是索引?MySQL中的一种获取数据的数据结构。(快速查找排好序的一种数据结构)索引分别有哪些优点和缺点?以下 SQL 有什么问题?该如何优化?为什么 MySQL 官方建议使用自增主键作为表的主键?自增主键有哪些优缺点?索引有几种类型?分别如何创建?主索引和唯一索引有什么区别?在 InnDB 中主键索引为什么比普通索引的查询性能高?什么叫回表查询?如何查询一张表的所有索引?MySQL 最多可以创建多少

2020-06-22 12:02:57 167

原创 MySQL基础模块

说一下 MySQL 执行一条查询语句的内部执行过程(可知数据库驱动已经加载)连接器(username,password,url)查询缓存(mysql中的缓存8.0之后没默认移除了)分析器(词法语法分析器。查看sql语句是否正确)优化器(查看是否执行索引,按照最优的方案去执行)执行器(执行语句,拿回返回数据)存储引擎(主要负责数据的存储和读取)MySQL 查询缓存的功能有何优缺点?每一条查询sql都会被当做K重新记录,不需要额外解释和执行。会出现内存碎片MySQL 的常用引擎都有哪

2020-06-21 16:25:02 148

转载 Java中的反射

反射机制介绍Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。获取Class对象的两种方式如果我们动态获取到这些信息,我们需要依靠Class对象。Class类对象将一个类的方法、变量等信息告诉运行的程序。 知道具体类的情况下可以使用: C...

2020-04-15 17:05:52 79

原创 Java并发编程(13)原子操作类

当程序更新一个变量时,如果多先册灰姑娘同时更新这个变量,可能得到期望之外的值,比如变量i++,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2...

2020-04-09 16:07:04 91

原创 Java并发编程的艺术---线程池的使用

线程池的使用线程池的创建看一下常用的构造方法 public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ...

2020-04-09 15:47:39 92

原创 Java并发编程的艺术---线程池实现原理

线程池的实现原理线程池处理流程(1)线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程(2)线程池判断工作队列是否已经满。如果工作队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了。则进入下一个流程(3)线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行。...

2020-04-09 00:23:59 147

原创 Java并发编程的艺术(17)Exchanger

线程间交换数据的ExchangerExchanger(交换者)是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交 换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过 exchange方法交换数据,如果第一个线程先执行exchange()方法,它会一直等待第二个线程也 执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本...

2020-04-02 12:44:30 82

原创 Java并发编程的艺术(16)Semaphore

控制并发线程数的SemaphoreSemaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源比如××马路要限制流量,只允许同时有一百辆车在这条路上行使,其他的都必须 在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶 入××马路,但是如果前一百辆中有5辆车已经离开了××马路,那么后面就允许有5辆车驶入马 路,这...

2020-04-02 12:39:09 63

原创 Java并发编程的艺术(15)CyclicBarrier

CyclicBarrier简介CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数 量,每个线程调用await方法告诉CyclicBarrier我已经到达了屏障,然后当前线程被阻塞。public class CyclicBarrierTest { static CyclicBarrier c = new Cyclic...

2020-04-02 12:28:23 116

原创 Java并发编程的艺术(14)CountDownLatch

CountDownLatchCountDownLatch允许一个或多个线程等待其他线程完成操作假如有这样一个需求:我们需要解析一个Excel里多个sheet数据,此时可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法时使用join()方法public cl...

2020-04-02 12:06:47 80

原创 Java并发编程的艺术(12)重入锁和读写锁

重入锁重入锁ReentrantLock,表示该锁能够支持一个线程对资源的重复加锁。支持获取锁时的公平和非公平性选择。synchronized关键字隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次地获得该锁。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lock()方 法时,已...

2020-04-01 20:23:09 116

原创 Java并发编程的艺术---重排序

并发编程——重排序在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序。(1)编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序(2)指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的顺序(3)内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作...

2020-04-01 15:03:57 135

原创 Java并发编程的艺术(11)AQS队列同步器

LOCK

2020-04-01 13:22:36 181

原创 Java并发编程的艺术(10)并发编程基础

线程简介现代操作系统在运行一个程序时,会为其创建一个进程。例如,启动一个Java程序,操作系统就会创建一个Java进程。进程是操作系统可以调度的最小单位。一个进程可以包含多个线程,这些线程都拥有各自的计数器、堆栈、和局部变量等属性,并且能够访问共享变量。线程是CPU分配资源的最小单位。线程优先级现代操作系统基本采用时分的形式调度运行的线程,操作系统会分出一个个时间片,线程会分配到若干时...

2020-03-28 14:43:16 68

原创 Java并发编程的艺术(9)final

final域的读和写更像是普通的变量访问final域的重排序规则对于final域,编译器和处理器要遵守两个重排序规则。(1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。(2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能 重排序。示例在这里插入代码片...

2020-03-27 23:29:55 63

原创 Java并发编程的艺术(8)锁的内存语义

从所周知,锁可以让临界区互斥执行。锁的释放-获取建立的happens-before关系锁时Java并发编程中最重要的同步机制。锁除了让临界区互斥执行外,还可以让释放锁的线程向获取同一个锁的线程发送消息。class MonitorExample { int a = 0; public synchronized void writer() { 1 a++...

2020-03-27 19:17:23 118

原创 Java并发编程的艺术---volatile内存语义及实现

当声明共享变量为volatile后,对这个变量的读/写将会特别。volatile的特性(1)可见性:对一个volatile变量的读,总是能看到(任意线程)对这个volatile变量最后的写入(2)原子性:对任意单个volatile变量的读/写具有原子性,但类似于volatile++这种复合操作不具有原子性volatile写-读建立的happens-before关系volatile写-读的...

2020-03-27 16:44:49 144 1

原创 Java并发编程的艺术---happens-before

happens-before

2020-03-27 12:49:09 178

原创 Java并发编程的艺术-锁的状态与对比

锁的升级Java SE1.6为了减少获得锁和释放锁带来的性能消耗,引入了“偏向锁”和“轻量级锁”,在JavaSE 1.6中,锁一共有4中状态,级别从低到高一次是:无所状态、偏向锁状态、轻量级锁状态和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不饿能降级成偏向锁。这种锁升级却不能降级的册罗,目的是为了提高获得锁和释放锁的效率偏向锁大多数情...

2020-03-26 20:28:51 122

原创 Java并发编程的艺术-原子性

原子操作的实现原理原子(atomic)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意 为“不可被中断的一个或一系列操作”。在多处理器上实现原子操作就变得有点复杂。让我们 一起来聊一聊在Intel处理器和Java里是如何实现原子操作的。处理器如何实现原子操作(1)使用总线锁保证原子性如果多个处理器同时对共享变量进行读改写操作(i++),那么共享变量就会...

2020-03-26 16:41:19 184

原创 Java并发编程的艺术-synchronized和volatile底层实现原理

volatile的定义与实现Java编程语言允许线程访问共享变量,为了确保共享变量能够准确和一致的更新,线程应该通过排他锁单独获取这个变量。如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。Lock前缀有volatile变量修饰的共享变量进行读写操作时,JVM就会向处理器发送一条Lock前缀指令,Lock前缀的指令在多核CPU处理器下会引发以下两...

2020-03-26 16:07:53 113

原创 Java并发编程的艺术-并发编程问题

为什么要并发编程并发编程的目的是为了让程序运行得更快。并发编程会遇到的问题,上下文切换问题,死锁问题,以及受限于硬件和软件的资源限制问题。上下文切换CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保留上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。死锁线程t1和线程t...

2020-03-26 12:29:02 99

空空如也

空空如也

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

TA关注的人

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