自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 linux服务器防火墙配置

Linux服务器防火墙配置

2023-02-17 14:42:01 1253 2

原创 sql优化

mysql优化、sql执行顺序、sql执行计划、索引失效

2023-01-17 17:10:22 613

原创 Linux 运行jar包的几种方式及不挂断后台运行输出到文件详解

运行jar包、后台运行jar包输出到指定日志文件

2022-10-11 10:51:00 8270 1

原创 Linux Mysql安装

Mysql8安装

2022-06-19 17:59:32 164

原创 Nginx安装并配成系统服务-开机自启

nginx安装并设为系统服务,开机自启

2022-06-16 12:02:58 174

原创 Easypoi导出excel

第一步:导入依赖 <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.2.0</version> </dependency>第二部:构建导出excel实体类@Data@ExcelTarget("alarm

2022-03-18 14:07:44 2064

原创 ThreadPoolExecutor————一文解决ThreadPoolExecutor源码

源码解读的注释都在代码中,有些重复的代码没有注释,如若有哪些地方我理解错了欢迎评论区留言或者私信我指正,成长的路上相互学习共同进步。以下是ThreadPoolExecutor的所有源码,建议按照以下的顺序看1、先了解ThreadPoolExecutor的常量2、了解Worker内部类的结构3、execute()方法4、addWorker()方法5、runWorker()方法6、completedAbruptly()方法7、processWorkerExit()方法8、getTask()方法

2022-03-03 23:01:04 330

原创 JUC——ReentrantLock源码解读

源码解读的注释都在代码中,有些重复的代码没有注释,如若有哪些地方我理解错了欢迎评论区留言或者私信我指正,成长的路上相互学习共同进步。/** * @author: Rhine_He * @date: 2022-02-26-10:11 * @function: * @description: **/import java.io.IOException;import java.io.ObjectInputStream;import java.io.Serializable;import ja

2022-02-26 15:05:01 172

原创 JUC——AQS(AbstractQueuedSynchronizer )源码解读

源码解读的注释都在代码中,有些重复的代码没有注释,如若有哪些地方我理解错了请评论区留言或者私信我,相互学习共同进步。AQS原理Abstract : 在AbstractQueuedSynchronizer 中不知道具体怎么上锁。所以使用模板方法设计模式,暴露出上锁逻辑Queue:线程阻塞队列Synchronizer:同步CAS+state 完成多线程抢锁逻辑Queue 完成抢不到锁的线程排队(同步线程)如果是ReentrantLock创建了多个condition,那么这儿还有多个条件等待队列

2022-02-25 23:50:03 335

原创 多线程——生产者消费者模型

写一个固定容量同步容器,拥有put和get方法,以及getCount方法,能够支持2个生产者线程以及10个消费者线程的阻塞调用。1、synchronized同步方法public class Container1<T> { final private LinkedList<T> lists = new LinkedList<>(); final private int MAX = 10; //最多10个元素 private int count = 0; /

2022-02-13 16:29:04 409

原创 多线程——线程精确控制

实现一个容器,提供两个方法,add,size写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束1、使用同步容器注意:确保t2线程先运行,否者t1线程先运行size超过5时t2线程一直无法结束,导致程序无法退出public class TestSynchronizedContainer { volatile List lists = Collections.synchronizedList(new LinkedList<>());

2022-02-13 15:28:03 330

原创 多线程——零散知识补充

ReentrantLockreentrantlock用于替代synchronized,使用reentrantlock可以完成synchronized同样的功能,但需要注意的是,必须要必须要必须要手动释放锁,使用synchronized锁定的话如果遇到异常,jvm会自动释放锁,但是lock必须手动释放锁,因此经常在finally中进行锁的释放。ReentrantLock vs Synchronized1、底层是cas vs sync锁升级,2、可以使用trylock控制锁不上的情况,3、lockin

2022-02-12 22:19:57 1217

原创 多线程——Atomic、synchronized、LongAdder(自旋锁、系统锁、分段锁)

Atomic:使用自旋锁,如果线程多,执行时间长会消耗CPU资源,性能消耗在切换线程上,所以如果线程少,执行时间不长,推荐使用自旋锁来保证线程安全。使用场景:线程少,加锁时间短。Synchronized:系统锁,在没有锁升的情况下属于总量级锁,每次加锁都要向操作系统申请加锁,加锁时间慢,使用该锁存在同步队列,即如果没有抢到锁的线程会加入到队列中,等到锁得到释放才会通知去获取锁,不会导致大量CPU来回切换线程。适用场景:线程数量多,加锁时间长。LongAdder:分段锁,在多个线程执行时存在多个锁,分别管

2022-02-12 19:07:30 580

原创 对象的创建过程

Object o = new Object();创建对象分为3步:1、new–>申请一段内存空间,此时对象的属性值都是默认值,对象还处于半成品状态;2、调用构造方法,初始化对象,给对象中的各属性赋值,赋值完后,该对象才是完整的对象,中间有个半初始化状态;3、建立关联,将对象的地址值赋给o,t在未压缩的情况下64位,压缩的情况下32位...

2022-02-12 18:45:11 2780

原创 多线程——并发编程三大特性

并发编程三大特性1、可见性:各线程之间对共享变量的可见性,即一个线程更改了共享变量的值,其他线程也能看到并更新到自己线程中的值。共享资源一般都放在堆空间(主内存),每个线程使用公共资源都会将公共资源拷贝一份到自己的线程中(本地缓存),当一个线程对共享资源进行更改并写回到堆空间,而其他线程不知道共享资源已经被修改了。Volatile:使用Volatile修饰共享变量(非引用类型),当一个线程对共享变量进行更改,会让其他线程都会读到变量的更改值。使用volatile,将会强制所有线程都去堆内存中读取runn

2022-02-09 13:55:28 1760

原创 多线程——线程状态及线程常用方法

线程常用方法1、sleep():让出CPU,拥有锁不释放锁(TImedWaiting),可在任意地方调用,不必非得在同步代码中 可以使调用线程睡眠相应的时间,睡足时间后便又回到可运行状态等待CPU调度。2、yield():** netive静态方法,让出CPU,拥有锁不释放锁,并回到可运行状态(Ready),和其他可运行线程一起等待CPU调度**,可能CPU依旧会调用到该线程。3、join():使当前线程进入阻塞状态(Waiting),等待调用线程执行完后才能继续运行,join(time):使得线程在

2022-02-08 13:38:31 426

原创 多线程——程序、进程、线程及创建线程的5种方法

程序、进程、线程概念程序:可执行文件,如,QQ.exe、项目jar包、war包、Linux中.sh进程:进程是资源分配的基本单位,程序运行会产生一个进程,没有限制的话一个程序可以多运行几个,便产生多个进程;我们一般打开的QQ、QQ音乐、office、浏览器都是相应的程序运行产生的进程。线程:CPU调度的基本单位,一个程序中不听的执行路径。如:QQ音乐在听歌的同时,歌词在在跟着自动往上滑。音乐播放是一个线程、歌词滑动是一个线程,各司其职,相互关联。创建线程的5种方法注意:所谓5种方法,其本质及底层都

2022-02-07 10:35:25 400

原创 前后端参数传递总结(@RequestParam @RequestBody@PathVariable)

前后端参数传递总结(@RequestParam @RequestBody@PathVariable @RequestHeader )@RequestParam@RequestBody合理的创建标题,有助于目录的生成如何改变文本的样式@RequestParam@RequestParam 常用来处理简单类型的绑定,通过Request.getParameter() 获取的String可直接转换为简单类型的情况( String–> 简单类型的转换操作由ConversionService配置的转换器来完成

2021-10-31 18:06:19 19832

转载 缓存穿透、缓存击穿、缓存雪崩区别和解决方案

一、缓存处理流程 前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到 更新缓存,并返回结果,数据库也没取到,那直接返回空结果。二、缓存穿透 描述: 缓存穿透是指缓存和数据库中都没有的数据,而用户不断发起请求,如发起为id为“-1”的数据或id 为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。 解决方案: 1 接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截; 2 从缓存取不

2021-09-24 14:17:57 75

转载 MyISAM与InnoDB 的区别

区别:InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次

2021-09-13 23:38:38 85

转载 Java并发编程:Synchronized及其实现原理

声明:文章引用于:https://www.cnblogs.com/paddix/p/5367116.html一、Synchronized的基本使用Synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:  (1)修饰普通方法  (2)修饰静态方法  (3)修饰代码块  接下来我

2021-09-13 23:02:00 56

原创 elk快速下载网址(华为镜像)

ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=Dlogstash: https://mirrors.huaweicloud.com/logstash/?C=N&O=Dkibana: https://mirrors.huaweicloud.com/kibana/?C=N&O=D

2021-05-28 10:21:54 480

原创 Linux常用命令大全

常用指令ls   显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all)mkdir 创建目录 -p 创建目录,若无父目录,则创建p(parent)cd 切换目录touch 创建空文件echo 创建带有内容的文件。cat 查看文件内容cp

2021-04-01 10:11:02 64

原创 Java——重定向与请求转发

重定向(Redirect)所谓重定向就是接收到你的请求后返还给你另一个请求地址,你继续访问。比如,张三给我借钱,我是妻管严,手里没有零花钱,但是我知道李四有钱,于是我告诉你向李四借钱,此时你向我发出的请求得到了我借不了的回应并告诉你谁可以借给你,于是你又向李四发起请求开始借钱。 response.sendRedirect(“main.html”);请求过程如下图:请求转发(forward)请求转发简单的说就是你发起的请求并不是一个人完成,比如你去购买一部手机,店员直接就返回你一部手机,但是这部手机

2020-07-10 16:28:52 229

原创 JDBC原始封装

最简单的JDBC封装import java.sql.*;/** * @author Rhine_He * @date 2020-06-24-14:54 **/public class DBUtil { static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStack

2020-07-10 09:34:30 90

原创 封装的JDBC工具

封装JDBC为了更加方便的对数据库进行增删改查,就需要将连接数据库的方法进行封装,这样我们开发的时候便能更加方便的进行开发。做到写更少的代码,做更多的事儿。下面呢我将展示使用封装后的工具对数据库进行操作import java.io.IOException;import java.io.InputStream;import java.lang.reflect.Field;import java.sql.*;import java.util.ArrayList;import java.util.D

2020-07-10 09:32:02 123

原创 最基本的JDBC模板及数据库乱码处理

初学JDBCpublic class JDBCDemo1 { public static void main(String[] args) throws Exception { //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2、获取连接对象 Connection connection = DriverManager.getConnection("jdbc:mysql://loca

2020-06-28 14:38:17 238

原创 Java基础————线程安全售票案列

线程安全之售票案例在本篇博客中我将讲述继承Thread的线程的三种上锁方式(同步代码块、同步方法、Lock锁),以及实现Runnable接口的三种上锁方式。继承Thread的线程使用同步代码块public class SellTicketExtendsThreadSynchronized { public static void main(String[] args) { SellTicketThread t1 = new SellTicketThread("窗口一"); Sel

2020-06-15 22:55:17 176

原创 Java基础————线程知识

线程转后台线程后台线程也叫守护线程,其含义是后台线程默默的守护着非后台线程,直到非后台线程停止运行消亡后,后台线程就跟着自动消亡。public class GuardTreadTest { public static void main(String[] args) throws InterruptedException { GuardThread t0 = new GuardThread();//创建一个线程对象 t0.setDaemon(true);//设置当前线程为后台线程 t0

2020-06-15 16:10:33 101

原创 Java基础————线程的创建

Java线程的创建在这里我将提供两种基本的线程创建方法,其实对于线程大家很早就接触了,只是大家不知道而已,从你开始使用public static void main 这个主方法时,你就使用了线程,主方法时一个主线程。也就是说我们以前写的都是单线程程序。进程与线程进程:进程是系统进行资源分配和调用的独立单元,每个进程都有它独立的内存空间和系统资源。线程:线程是进程里面的一条执行路径,每个线程同享进程里面的内存空间和系统资源总结:也就是说进程包含线程,一个进程里可以包含一个或多个线程,进程只有一条线

2020-06-15 15:51:17 125

原创 Java集合————Map使用Value值排序

Java集合————Map使用Value值排序在Map集合中,一般是使用键值进行自然排序,所谓自然排序就好比自然数:1、2、3、4、5这样的顺序,字母的话就像A、B、C、D、E、F如此排序。但是由于一些特殊的需求,我们需要使用value值进行排序,话不多说,我们直接来看代码import java.awt.List;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import

2020-06-14 10:53:25 1215

原创 Java集合————ConcurrentHashMap

ConcurrentHashMap基本知识1、ConcurrentHashMap是一种以键值对的方式存储的集合2、ConcurrentHashMap是一种无序的集合3、ConcurrentHashMap是通过HashCode来存放元素的集合4、ConcurrentHashMap是元素不可重复的集合(键不可重复)5、ConcurrentHashMap是一个线程安全的集合6、HashTable采用分段式加锁,比HashTable效率高7、ConcurrentHashMap的不许存入null键nu

2020-06-14 10:31:22 1151

原创 Java集合————HashTable

HashTable基本知识1、HashTable是一种以键值对的方式存储的集合2、HashTable是一种无序的集合3、HashTable是通过HashCode来存放元素的集合4、HashTable是元素不可重复的集合(键不可重复)5、HashTable是一个线程安全的集合(与HashMap的区别)6、HashTable直接在方法上加锁,效率低7、HashTable的不许存入null键null值创建集合Hashtable集合是以键值对的形式的集合,在创建时就必须规定键和值的泛型,并且键和

2020-06-14 10:25:49 469

原创 Java集合————HashMap

HashMap基本知识1、HashMap存储的是键值对2、HashMap集合是无序的3、HashMap存储的元素是不可重复的(键不可重复)4、HashMap是一个线程不安全的集合5、HashMap是通过HashCode来存放数据6、HashMap的允许存入null键null值创建集合HashMap集合是以键值对的形式的集合,在创建时就必须规定键和值的泛型,并且键和值都是使用的引用类型。HashMap<String,Integer> map = new HashMap<&

2020-06-14 10:19:16 182

原创 java集合——HashSet与LinkedHashSet

Set VS ListList是有序的可重复集合,Set是自然有序不可重复集合List的有序是指集合元素添加的顺序与取出的顺序一致,而Set是一种自然有序的集合,自然有序是指集合类的元素是自然排序(自然排序:比如自然数:1,2,3,4,5,6 字母顺序:a,b,c,d,e)List是有序存储,存在下标,Set是使用HashCode进行存储,不存在下标,其底层是由map来实现。HashSet的基本使用...

2020-06-11 16:02:51 392

原创 Java集合----LinkedList

浅谈LinkedList首先呢我们来说说何为LinkedList,通过这个名字呢,我们不难看出,这是啷个单词的合成词,也就是Link 和List,别纠结我为什么不说是Linked好吧!Link呢是链接的意思,List呢是列表,连起来很形象的可以想象到用绳子将一张张表连起来,当你拿到一串连起来的列表中的一张时,那你肯定通过绳子知道上一张列表和下一张列表。通过上面我的剖析,总结一下,这个集合就是一个以双向链表数据结构构成的有序的集合集合元素的创建LinkedList list = new LinkedLi

2020-06-11 07:57:30 203

原创 泛型

泛型泛型:把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型今天我们来聊聊集合中、类中和方法中以及参数中使用泛型集合中的泛型在list或者map中我们经常使用泛型,一旦我们确定好了使用的类型,那么集合就必须使用对应的类型,如果类型不一致就会报错。就拿ArrayList为例:MyArrayList<Integer> list2 = new MyArrayList<>();list2.add(10000);//参数类型必须和对象的泛型匹配ArrayList&

2020-06-10 22:52:13 106

原创 集合之ArrayList

集合之ArrayList集合 VS 数组1、数组声明后只能存放同一种数据类型,而集合可以存放不同的数据类型2、数组声明后,长度便固定了,而集合长度是可变的3、数据可以存放计本数据类型和引用数据类型,集合只能存放引用数据类型,要想集合能放基本数据类型可以转为相应的包装类数据类型。ArrayList首先我们来了解一下ArrayList,它是一个可变长的集合,当指针等于数组的长度时,集合自动扩容至原来的1.5倍,初始长度是10,是一个线程不安全的一维数组的数据结构,并且它是有序,可使用索引访问、元素可

2020-06-10 20:17:04 197

原创 String(一个特殊的数据类型)

String(一个特殊的数据类型)在我的眼里,我觉得String是一个特殊的数据类型,为什么特殊呢?因为最初我以为它和byte、boolean、char、short、int、float、long、double等八种基本数据类型一样,甚至最初还把它当成了八种基本数据类型之一。后来才发现是错的。那它为什么它不属于基本数据类型呢,这是因为基本数据类型不能创建对象,而String是可以创建对象的,String它是一个类,而基本数据类型不是,这就是这个数据类型的特别之处。String创建对象String创建对象

2020-06-06 10:24:45 6380 1

原创 Integer面试解析、equals与==的区别

Integer面试解析、equals与==的区别我们都知道Integer是一个包装类,它是解决基本数据类型(int)不能创建对象而引入的,但是当它创建对象会有所不同,比如以下代码: Integer integer = Integer.valueOf(100); Integer integer2 = Integer.valueOf(100); System.out.println(integer == integer2);//true System.out.println(integer.

2020-06-05 16:51:19 209

空空如也

空空如也

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

TA关注的人

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