自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Servlet 九大对象和四个作用域

序号 隐式对象 说明 1 request 转译后对应HttpServletRequest/ServletRequest对象 2 response 转译后对应HttpServletRespons/ServletResponse对象 3 ses...

2021-10-20 20:34:15 509

原创 redis的key命令总结

redis的key命令总结文章目录redis的key命令总结1.set2. key查询相关(1) keys *(2)使用 * 表示 0 或多个字符(3)使用 ? 表示单个(4)使用[a,b,c]表示包含[]内的字符3. exists4.move5. key过期时间相关(1) 以毫秒为单位设置key过期时间(2) 设置过期时间(UNIX时间戳)(3) 以秒为单位返回key剩余过期时间(4) 以毫秒为单位返回key剩余过期时间(5) 取消key的过期时间,key将持久保持6. 查询key的数据类型7. 删除

2021-10-20 20:30:44 533

原创 redis基础知识

redis基础知识文章目录redis基础知识1. 测试redis性能,redis是否正常运行2.查看redis信息(完整,方便查阅)1. 测试redis性能,redis是否正常运行1.测试redis性能redis-benchmark2.查看redis服务是否正常运行ping 如果正常--pong3.查看redis的统计信息info[root@localhost redis-6.0.6]# redis-cli127.0.0.1:6379> pingPONG2.查看re

2021-10-20 20:30:08 79

原创 CentOS下安装redis

CentOS下安装redis文章目录CentOS下安装redis1.xshell连接centos8 [桥接模式]1.1 Linux下切换用户到root1.2 设置IP地址,子网掩码,网关和DNS(联网)1.3 设置主机名(可略过)1.4重启网络服务2.Linux下安装redis2.1 下载redis压缩包(redis)2.2 xftp工具连接虚拟机,将redis压缩包放到/opt/mysoftwares目录下2.3 进入/opt/mysoftwares目录下,解压redis到/opt目录2.4 进入解压目

2021-10-20 20:29:58 110

原创 同步模式-交替输出

同步模式-交替输出文章目录同步模式-交替输出1.介绍2.wait/notifyAll 方式3.ReentrantLock 实现4. park/unpark 实现1.介绍线程1输出 a 5 次,线程 2 输出 b 5 次,线程 3 输出 c 5 次。现在要求输出 abcabcabcabcabc 怎么实现。2.wait/notifyAll 方式/** * wait-notify版 * * 等待标记法 * a 1 * b 2 * c 3 *///定义锁对象static fi

2021-10-19 15:02:39 124

原创 同步模式-顺序控制

同步模式-顺序控制文章目录同步模式-顺序控制1.wait/notify版2.ReentrantLock版1.wait/notify版/** * 同步模式-顺序控制 */@Slf4j(topic = "c.TestSyncModel_SequenceControl")public class TestSyncModel_SequenceControl { /** * 先执行t2后执行t1 * wait-notify()实现 */ //定义锁对象

2021-10-19 14:59:28 112

原创 ReentrantLock 可重入锁

ReentrantLock 可重入锁文章目录ReentrantLock 可重入锁1.特点2.基本语法3.可重入4.可打断5.锁超时6.使用锁超时解决哲学家就餐问题7.公平锁8.条件变量9.用ReentrantLock改写送烟送外卖代码1.特点相对于 synchronized 它具备如下特点可中断可以设置超时时间可以设置为公平锁(先进先出)构造参数为true表示公平锁。支持多个条件变量(休息室)(条件不满足时进入waitSet等待)与 synchronized 一样,都支持可重入。2.基

2021-10-19 14:57:19 158

原创 锁的活跃性

锁的活跃性文章目录锁的活跃性1.死锁1.1介绍1.2死锁代码1.3死锁定位经典死锁问题-哲学家进餐问题2.活锁3.饥饿1.死锁1.1介绍有这样的情况:一个线程需要同时获取多把锁,这时就容易发生死锁。t1线程获得A对象锁,接下来想获取B对象的锁, t2线程获得B对象锁,接下来想获取A对象的锁。1.2死锁代码static final Object A = new Object();static final Object B = new Object();@Testpublic void

2021-10-19 14:51:38 274

原创 锁的粒度粗细

锁的粒度粗细文章目录锁的粒度粗细1.锁住不同的对象会有不同的效率1.锁住不同的对象会有不同的效率1.锁住大对象,会造成低并发程度/** * 直接锁大对象 */@Slf4j(topic = "c.BigRoom")class BigRoom { public void sleep() { synchronized (this) { //直接锁住当前对象 log.debug("睡觉2小时"); try {

2021-10-19 14:43:01 201

原创 重新理解线程状态转换

重新理解线程状态转换文章目录重新理解线程状态转换1.线程状态转换2.不同过程分析情况1:NEW-->RUNNABLE情况2:RUNNABLE<-->WAITING情况3:RUNNABLE<-->WAITING情况4:RUNNABLE<-->WAITING情况5:RUNNABLE<-->TIMED_WAITING情况6:RUNNABLE<-->TIMED_WAITING情况7:RUNNABLE<-->TIMED_WAITING情况

2021-10-19 14:39:38 96

原创 park和unpark

park和unpark文章目录park和unpark1.基本使用2.演示代码3.特点4.park()/unpark()底层原理(重要)5.源码分析1.基本使用它们是 LockSupport 类中的方法// 暂停当前线程LockSupport.park();// 恢复某个线程的运行LockSupport.unpark(暂停线程对象)先 park 再 unpark2.演示代码/** * 暂停当前线程 * LockSupport.park(); * 恢复某个线程的运行 * LockSu

2021-10-19 14:26:42 136

原创 异步模式-生产者/消费者

异步模式-生产者/消费者文章目录异步模式-生产者/消费者1.概念2.代码实现生产者-消费者模式代码1.概念与前面的保护性暂停中的 GuardObject 不同,不需要产生结果和消费结果的线程一一对应;消费队列可以用来平衡生产和消费的线程资源;生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据;消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据;JDK 中各种阻塞队列,采用的就是这种模式;消息队列有延时,不会被立刻消费,异步的。2.代码实现生产者-消费

2021-10-19 14:19:41 131

原创 同步模式-保护性暂停

同步模式-保护性暂停文章目录同步模式-保护性暂停1.概念2.GuardedObject代码和测试代码3.扩展1-添加获取超时参数4.扩展2-多任务版GuardedObject5.join原理1.概念即 Guarded Suspension,用在一个线程等待另一个线程的执行结果。要点:有一个结果需要从一个线程传递到另一个线程,让他们关联同一个 GuardedObject如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK 中,join 的实现、Future 的实现

2021-10-19 14:15:28 232

原创 wait/notify

wait/notify文章目录wait/notify1.wait/notify工作原理2.wait/notiy API3.代码思考,体会使用sleep和wait/notify的区别4.wait()/notify() 虚假唤醒解决方法1.wait/notify工作原理Owner线程发现条件不满足,调用wait()方法,即可进入WaitSet变成WAITING状态。BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片。BLOCKED线程会在Owner线程释放锁时唤醒。WAITI

2021-10-19 14:04:50 124

原创 Spring练习-CRUD操作[6]-删除用户

Spring练习-CRUD操作[6]-删除用户文章目录Spring练习-CRUD操作[6]-删除用户1.删除用户的步骤分析2.打包部署空项目3.编写代码3.1 UserController编写删除代码3.2 UserService编写删除代码3.3UserDao编写删除代码1.删除用户的步骤分析① 点击用户列表的删除按钮,发送请求到服务器端② 编写UserController的deleteById()方法③ 编写UserService的deleteById()方法④ 编写UserDao的dele

2021-10-18 21:26:45 248

原创 Spring练习-CRUD操作[5]-添加用户

Spring练习-CRUD操作[5]-添加用户文章目录Spring练习-CRUD操作[5]-添加用户1.用户添加的步骤分析2.打包部署空项目3.编写在添加用户页面展示角色列表的代码3.1 在UserController中添加展示角色列表的方法3.2 修改jsp3.3测试4.编写添加用户的代码4.1 UserController中添加用户的方法4.2 UserService中添加用户的方法4.3UserDao中添加用户和添加用户角色的方法(难点)4.4修改jsp4.5测试1.用户添加的步骤分析① 点击列

2021-10-18 16:35:47 493

原创 Spring练习-CRUD操作[4]-用户列表展示

Spring练习-CRUD操作[4]-用户列表展示文章目录Spring练习-CRUD操作[4]-用户列表展示1.角色列表的展示步骤分析2.部署查看空项目3.编写代码3.1 修改用户的POJO类User.class3.2 UserController添加查询方法3.3 在RoleDaoImpl中添加条件查询方法3.4 UserServiceImpl中添加查询方法(难点)3.5 在UserDaoImp中添加查询用户的方法3.6 修改jsp4.测试1.角色列表的展示步骤分析① 点击角色管理菜单发送请求到服务

2021-10-18 10:12:34 253

原创 Spring练习-CRUD操作[3]-添加角色

Spring练习-用户CURD操作[3]-添加角色文章目录Spring练习-用户CURD操作[3]-添加角色1.配置文件2.RoleController1.配置文件见[2]2.RoleController

2021-10-18 09:12:36 145

原创 Spring练习-CRUD操作[2]-角色列表的展示

角色列表的展示和添加操作文章目录角色列表的展示和添加操作1.步骤分析(逆过程)2.测试打包发布空项目(只有静态页面)3.编写后台代码(逆向编写controller->dao)3.1 配置文件3.2 编写RoleController代码(返回响应体)3.3编写RoleServiceImpl代码3.4 编写RoleDaoImpl代码3.5 启动服务器,测试1.步骤分析(逆过程)① 点击角色管理菜单发送请求到服务器端(修改角色管理菜单的url地址)② 创建RoleController和showLis

2021-10-17 10:30:31 218

原创 Spring练习-CRUD操作[1]-环境搭建

Spring练习-用户CURD操作[1]-环境搭建文章目录Spring练习-用户CURD操作[1]-环境搭建Spring 环境搭建1. 创建工程(Project&Module)2.导入静态页面(见资料jsp页面)3.导入需要坐标(见资料中的pom.xml)4.创建包结构(controller、service、dao、domain、utils)6.创建POJO类(User.java和Role.java)7.创建配置文件Spring 环境搭建① 创建工程(Project&Module)②

2021-10-17 09:14:27 474

原创 Spring JdbcTemplate基本使用

Spring JdbcTemplate基本使用文章目录Spring JdbcTemplate基本使用1.JdbcTemplate概述2. JdbcTemplate开发步骤3.快速入门4. Spring产生JdbcTemplate对象1.JdbcTemplate概述它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的Red

2021-10-17 08:40:00 1173

原创 SpringMVC文件上传

SpringMVC文件上传文章目录SpringMVC文件上传1.文件上传3要素2.文件上传原理3.单文件上传4.多文件上传1.文件上传3要素表单项type=“file”表单的提交方式是post表单的enctype属性是多部分表单形式,及enctype=“multipart/form-data”2.文件上传原理当form表单修改为多部分表单时,request.getParameter()将失效。enctype=“application/x-www-form-urlencoded”时,f

2021-10-17 07:49:18 100

原创 SpringMVC获得请求数据

SpringMVC获得请求数据文章目录SpringMVC获得请求数据1.SpringMVC可获得请求参数2. 获得基本类型参数3.获得POJO类型参数4. 获得数组类型参数5.获得集合类型参数6.请求数据乱码问题7.参数绑定注解@requestParam8.获得Restful风格的参数9. 自定义类型转换器10.获得Servlet相关API11.获得请求头1.SpringMVC可获得请求参数客户端请求参数的格式是:name=value&name=value… …服务器端要获得请求的参数,有时

2021-10-17 07:49:10 384

原创 SpringMVC数据响应

SpringMVC数据响应文章目录SpringMVC数据响应1.SpringMVC数据响应方式2.页面跳转2.1直接返回字符串2.2返回ModelAndView对象2.3 向request域存储数据3.回写数据3.1 直接返回字符串3.2 返回对象或集合1.SpringMVC数据响应方式1.页面跳转直接返回字符串通过ModelAndView对象返回2.回写数据直接返回字符串返回对象或集合2.页面跳转2.1直接返回字符串直接返回字符串:此种方式会将返回的字符串与视图解析器

2021-10-17 07:48:50 411

原创 SpringMVC组件解析

SpringMVC组件解析文章目录SpringMVC组件解析1.SpringMVC流程图示2.SpringMVC开发流程3.SpringMVC执行流程(重要)4.SpringMVC组件解析(重要)5.SpringMVC注解解析6. SpringMVC的XML配置解析6.1视图解析器附1:完整的DispatchServlet.properties附2:视图解析器源码1.SpringMVC流程图示2.SpringMVC开发流程① 导入SpringMVC相关坐标② 配置SpringMVC核心控制器Di

2021-10-17 07:48:37 121

原创 SpringMVC快速入门

SpringMVC快速入门文章目录SpringMVC快速入门1.简介2.快速入门1.简介SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,属于SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 中。SpringMVC 已经成为目前最主流的MVC框架之一,并且随着Spring3.0 的发布,全面超越 Struts2,成为最优秀的 MVC 框架。它通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须

2021-10-15 10:40:30 95

原创 Synchronized原理进阶(轻量级锁,锁膨胀,自旋锁,偏向锁)

Synchronized原理进阶(轻量级锁,锁膨胀,自旋锁,偏向锁)文章目录Synchronized原理进阶(轻量级锁,锁膨胀,自旋锁,偏向锁)1.轻量级锁2.锁膨胀3.自旋优化4.偏向锁4.1 对象头格式MarkWord4.2 偏向锁状态4.3 撤销-调用对象的hashCode方法4.4 撤销-其他线程使用对象4.5 撤销-调用wait/notify4.6 批量重偏向4.7批量撤销5.锁消除1.轻量级锁轻量级锁的使用场景:如果一个对象虽然有多个线程访问,但是多线程的访问时间是错开的(也就是没有竞争

2021-10-15 08:37:06 253

原创 synchronized原理-Monitor

synchronized原理-Monitor文章目录synchronized原理-Monitor1.Java对象头2.Monitor结构3.Monitor过程分析1.Java对象头Integer: 8+4 字节int:4字节32位虚拟机下:对象头在32位虚拟机下是64位(8字节)Mark Word(32位):Klass Word(32位):决定对象的类型,通过该指针可以找到类对象。array length(32)—>数组长度对Normal来说:hashCode(25)—&g

2021-10-15 08:36:59 139

原创 几种线程安全单例实现的分析

几种线程安全单例实现的分析文章目录几种线程安全单例实现的分析1.介绍2.分析几种不同的实现,判断其线程安全性1.介绍单例模式有很多实现方法,饿汉、懒汉、静态内部类、枚举类,试分析每种实现下获取单例对象(即调用getInstance)时的线程安全,并思考注释中的问题。饿汉式:类加载就会导致该单实例对象被创建。懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时才会创建。2.分析几种不同的实现,判断其线程安全性实现1问题1:阻止子类继承该类,破坏了单例方法。问题2:创建对象

2021-10-15 08:36:51 87

原创 happens-before规则

happens-before规则文章目录happens-before规则1.介绍1.介绍happens-before 规定了对共享变量的写操作对其它线程的读操作可见,它是可见性与有序性的一套规则总结,抛开以下 happens-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其它线程对该共享变量的读可见。线程解锁 m 之前对变量的写,对于接下来对 m 加锁的其它线程对该变量的读可见。线程对 volatile 变量的写,对接下来其它线程对该变量的读可见。线程启动(st

2021-10-15 08:36:44 94

原创 JMM-有序性

JMM-有序性文章目录JMM-有序性1.概念2.指令重排原理2.1 关于CPU的几个概念2.2 指令重排优化2.3 支持流水线的处理器2.4指令重排导致的问题3.volatile原理3.1如何保证可见性?3.2 如何保证有序性?4.double-checked locking 问题5.double-checked locking 解决方法1.概念JVM 会在不影响正确性的前提下,可以调整语句的执行顺序,思考下面一段代码。可以看到,至于是先执行 i 还是 先执行 j ,对最终的结果不会产生影响。所以

2021-10-15 08:36:35 554

原创 同步模式-Balking

同步模式-Balking文章目录同步模式-Balking1.介绍2.代码实现3.用来实现线程安全的单例1.介绍Balking (犹豫)模式用在一个线程发现另一个线程或本线程已经做了某一件相同的事,那么本线程就无需再做了,直接结束返回。2.代码实现package com.concurrent.p5;import lombok.extern.slf4j.Slf4j;import org.junit.Test;@Slf4j(topic = "c.SyncModel_Balking")publ

2021-10-15 08:36:27 184

原创 终止模式-两阶段终止模式

终止模式-两阶段终止模式文章目录终止模式-两阶段终止模式1. 介绍1.nterrupt实现2.volatile实现1. 介绍在一个线程 T1 中如何“优雅”终止线程 T2?这里的【优雅】指的是给 T2 一个料理后事的机会。1.nterrupt实现2.volatile实现package com.concurrent.p5;import lombok.extern.slf4j.Slf4j;import org.junit.Test;/** * 两阶段终止模式 */@Slf4j(to

2021-10-15 08:36:21 123

原创 JMM-可见性

JMM-可见性文章目录JMM-可见性1.概念2.可见性原因分析3.解决方法4.可见性和原子性区别1.概念当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道这个修改。串行程序不存在可见性问题 。因为你在任何一个操作步骤中修改某个变量,那么在后续的步骤中,读取这个变量的值,一定是修改后的新值并行程序中如果一个线程修改了某一个全局变量,那么其他线程未必可以马上知道这个改动//共享变量可见性问题static boolean run = true;@Testpublic void t

2021-10-15 08:36:12 185

原创 Java内存模型JMM

Java内存模型JMM文章目录Java内存模型JMM1.概念2.主内存与工作内存3.数据类型存储4.内存之间的交互5.JMM 3大特性6.指令重排序1.概念资料引用:深入理解JMM原理Java内存模型(Java Memory Model,JMM)JMM规定了线程和内存之间的一些关系。系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对

2021-10-15 08:36:04 77

原创 unsafe

unsafe文章目录unsafe1.反射创建Unsafe对象2. Unsafe的CAS操作3.自己实现原子整数类1.反射创建Unsafe对象/** * Unsafe 对象提供了非常底层的,操作内存、线程的方法,Unsafe 对象不能直接调用, * 只能通过反射获得 * private static final Unsafe theUnsafe; */@Testpublic void test_createUnsafeObj() throws NoSuchFieldException, Il

2021-10-14 09:33:32 90

原创 原子累加器

原子累加器文章目录原子累加器1.LongAdder比AtomicLong性能好的原因2.AtomicLong与LongAdder的比较代码3.LongAdder源码解析3.1 成员变量作用3.2 cas操作3.3Cell累加单元3.4@sun.misc.Contended 防止缓存行伪共享3.5 累加主要调用add方法3.6 longAccumulate方法源码分析(难)3.7 最后通过sum方法汇总1.LongAdder比AtomicLong性能好的原因性能提升的原因很简单,就是在有竞争时,设置多个

2021-10-14 09:31:07 247

原创 原子更新器

原子更新器文章目录原子更新器1.有哪些?2.例子1.有哪些?AtomicReferenceFieldUpdater // 域 字段AtomicIntegerFieldUpdaterAtomicLongFieldUpdater2.例子package com.concurrent.p7;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import java.util.concurrent.atomic.Atom

2021-10-14 09:24:54 98

原创 原子数组类

原子数组类文章目录原子数组类1.原子数组类有哪些?2.函数式接口说明3.演示1.原子数组类有哪些?AtomicIntegerArrayAtomicLongArrayAtomicReferenceArray2.函数式接口说明supplier 提供者 无中生有 ()->结果function 函数 一个参数一个结果 (参数)->结果BiFunction 函数 两个参数一个结果 (参数1,参数2)->结果consumer 消费

2021-10-14 09:23:49 167

原创 ABA问题

ABA问题文章目录ABA问题1.AtomicInteger不能解决ABA问题2. AtomicStampedReference 时间戳原子引用3.AtomicMarkableReference1.AtomicInteger不能解决ABA问题主线程仅能判断出共享变量的值与最初值 A 是否相同,不能感知到这种从 A 改为 B 又 改回 A 的情况。/** * ABA问题复现 */@Testpublic void test_ABAQuestion() { AtomicInteger ai

2021-10-14 09:21:36 230

空空如也

空空如也

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

TA关注的人

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