自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 定时任务Timer

定时任务类包括两个内部类 任务队列TaskQueue 任务执行线程TimerThreadTaskQueue 任务队列又包括TimerTask 任务调用Demo基本的使用方法:1.创建一个Timer对象2.创建一个TimerTask对象,在这里实现run方法3.将TimerTask对象作为参数,传入到Timer对象的scheule方法中,进行调度执行。流程图执行流程1创建Timer对象的时候同时启动了其成员变量的工作线程2工作线程的任务执行的任务run方法由用户实现,为

2022-02-14 15:15:22 286

原创 一文搞懂Tomcat中的循环队列

SynchronizedQueue基本信息入队出队扩容测试读者可以自己debug试一下,初始长度为4,先入队3次,再出队2次,再入队3次源码public class SynchronizedQueue<T> { public static final int DEFAULT_SIZE = 128; private Object[] queue; private int size; private int insert; priva

2021-12-03 17:15:26 533

原创 缓冲区为什么效率高?

什么是缓冲区缓冲区(Buffer)就是在内存中预留指定大小的存储空间用来对输入/输出(I/O)的数据作临时存储,这部分预留的内存空间就叫做缓冲区:使用缓冲区有这么两个好处:1、减少实际的物理读写次数2、缓冲区在创建时就被分配内存,这块内存区域一直被重用,可以减少动态分配和回收内存的次数举个简单的例子,比如A地有1w块砖要搬到B地由于没有工具(缓冲区),我们一次只能搬一本,那么就要搬1w次(实际读写次数)如果A,B两地距离很远的话(IO性能消耗),那么性能消耗将会很大但是要是此时我们有辆大卡车

2021-12-02 10:01:08 1286

原创 深入浅出AQS源码

个人学习AQS的一点见解,欢迎各位大佬指点交流文章目录概述流程图内部结构类属性节点acquire方法tryAcquireAddWaiterEnqacquireQueuedshouldParkAfterFailedAcquireparkAndCheckInterruptRelease 方法TryReleaseunparkSuccessor概述先翻译一下注释,了解一下该类设计的目的,英文捉急,各位凑活看看Provides a framework for implementing blocking l

2021-11-10 11:40:28 491

原创 线程池学习

线程池学习为什么用需要线程池线程池类结构线程池的核心属性线程池的基本工作原理线程池的各个状态线程池有哪些队列拒绝策略线程提前启动核心线程怎么保持一直存活非核心线程如何实现在 keepAliveTime 后死亡非核心线程能成为核心线程吗?如何终止线程池?Executors 提供了哪些创建线程池的方法?ctl设计的好处为什么用需要线程池如果我们在方法中直接new一个线程来处理,当这个方法被调用频繁时就会创建很多线程,不仅会消耗系统资源,还会降低系统的稳定性,一不小心把系统搞崩了,就可以直接去财务那结帐了。

2021-09-27 15:52:37 469

原创 分布式解锁为什么需要保证原子性

解锁操作的原子性客户端 A 获取锁成功;客户端 A 访问共享资源;客户端 A 为了释放锁,先执行 GET 操作获取锁对应的随机字符串的值;客户端 A 判断随机字符串的值,与预期的值相等;客户端 A 由于某个原因阻塞了很长时间;过期时间到了,锁自动释放了;客户端 B 获取到了对应同一个资源的锁;客户端 A 从阻塞中恢复过来,执行 DEL 操纵,释放掉了客户端 B 持有的锁。如下图解决方法:使用Lua脚本进行解锁...

2021-09-10 10:18:01 614

转载 分布式解锁时为什么需要唯一标识

Redis客户端误“解锁” 分布式锁就那点事 分布式场景要求“锁”在某个公共的地方 在单机场景中,为了同步多线程对同一份数据的操作,我们可以利用编程语言自带的工具来构建锁。如,Java 的 synchronized 关键字、ReentrantLock 类等。对于同一服务器上的多个进程,我们可以使用操作系统级别的“锁”来实现同步。如,C# 中以 “Global\” 开头作为 Mutex 的 N...

2021-09-07 16:13:20 483

原创 Redis分布式锁

Redis分布式锁前言分布式锁需要注意哪些点Redis分布式锁流程加锁和解锁加锁解锁set方法前言上图所示是我们搭建的分布式环境,有三个购票项目,对应一个库存,每一个系统会有多个线程,和上文一样,对库存的修改操作加上锁,能不能保证这6个线程的线程安全呢?当然是不能的,因为每一个购票系统都有各自的JVM进程,互相独立,所以加synchronized只能保证一个系统的线程安全,并不能保证分布式的线程安全。所以需要对于三个系统都是公共的一个中间件来解决这个问题。这里我们选择Redis来作为分布式锁,多

2021-09-07 15:38:35 299

原创 vim文本编辑器

vim文本编辑器概念三种模式:命令模式、插入模式和ex模式概念vim是vi的增强版本命令vim可以启动vim编辑器一般可以通过vim+目标文件路径的形式使用vim如果目标文件存在,则vim打开该文件若目标文件不存在,则新建该文件三种模式:命令模式、插入模式和ex模式任何模式都可以通过esc键回到命令模式在命令模式中按”i“键可以进入到插入模式,在插入模式中按esc可以返回命令模式在命令模式中按”:“可以进入ex模式,在ex模式中可以保存、修改和退出命令模式常用的命令如下:i 在光标前

2021-09-07 11:13:47 140

原创 类加载过程

类加载类加载过程加载验证准备解析初始化5种情况(jdk1.7)必须对类进行“初始化”类加载过程类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initialization)、使用(Using)和卸载(Unloading)7个阶段。其中准备、验证、解析3个部分统称为连接(Linking)。如图所示。加载、验证、准备、初始化和卸载这5个阶段的顺序是确定的,

2021-09-06 18:05:13 196

原创 什么是框架

框架引入一、问题:目前我们实现一个功能的基本流程如下:①创建一个web项目②创建数据库③使用jsp技术完成页面的创建④使用Servlet+MVC+Mybatis完成功能开发。但是在目前的流程中,代码的执行流程如下:在后台基于MVC的整个代码实现流程中,如果功能实现是分为10个步骤,发现其中有7个步骤是重复的。比如:数据库操作使用原生的jdbc来操作数据,查询所有的学生信息和查询所有的班级信息这两个代码除了Sql语句以及结果遍历不同外,其他的全部相同。也就说不同功能的代码中出现了相同

2021-03-20 08:31:49 424

原创 Explain关键字

是什么explain用于查看执行计划怎么用Explain + sql语句表头包含的信息id表的执行顺序Id相同执行顺序由上至下上图执行顺序 t1、t3、t2Id不同如果是子查询,id的序号会递增,id的值越大优先级越高,越先被执行上图执行顺序 t3、t1、t2Id有相同有不同Id如果相同则认为是一组,一组之中,由上至下顺序执行在所有组中 id 越大 优先级越高 越先执行Select type(查询类型)Type(访问类型)Possible_keys

2021-03-07 11:10:52 128

原创 复制文件夹

复制一个文件public void copyOne(String sourcefile ,String targetfile) throws Exception {BufferedInputStream fis = new BufferedInputStream(new FileInputStream(sourcefile));BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(targetfile));b

2021-03-07 10:20:55 111

原创 volatile关键字

volatile关键字理解概念举个栗子概念volatile 通过禁用 CPU 缓存,来保证多线程操作变量时的可见性在对这个变量的读写,不能使用 CPU 缓存,必须从内存中读取或者写入。举个栗子并发操作 a = 1 实现 a++不加volatile,从内存读取a=1后,后续的操作(读写)都是在cpu缓存中进行的。开启两个线程循环调用a++,循环的次数越多,得到的值越接近循环次数本身,因为读入到cpu缓存后一直进行a++操作,而每次的值都是从自己的缓存中取得,只有执行完循环才会写回内存。..

2021-03-07 10:12:37 97

原创 阻塞IO和NIO的区别

阻塞IO和NIO的区别个人理解阻塞io客户端连接后服务器创建一个socket与客户端的socket 通讯,这个 socket的方法需要线程运行,一个线程运行一个socket的服务即一个线程服务一个客户端,多个用户对应多个线程,多个线程轮番获得时间片,若是一个socket等待用户输入或者等用户读取(缓冲区的信息未处理好),则阻塞,时间片轮到这个线程时就这么在等待中啥也不干,直到客户端回应,所以造成CPU浪费Nio客户端连接和 服务器创建一个socket与客户端的socket 通讯 ,给服务端的so

2021-03-05 16:45:20 179

空空如也

空空如也

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

TA关注的人

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