自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

天上飞的云传奇

寻找机会、把握机会

  • 博客(141)
  • 资源 (3)
  • 问答 (6)
  • 收藏
  • 关注

原创 [JUC] 线程池实现原理,ThreadPoolExecutor 源码分析

[JUC] 线程池实现原理,ThreadPoolExecutor 源码分析第一天,了解基础1.线程池是什么?线程池,是一种管理多个线程的工具。常见的有,Mysql 数据库连接池。线程的创建和销毁是会带来额外的开销,并且过多的线程也会让系统承受不住。所以,线程池就是用来解决这两个问题。1.线程池会保持一定数目的核心线程一直存活。这样任务可以及时的处理,也不会有创建带来的开销。2.线程池也会管理线程,过多的任务会进入线程池的阻塞队列中,并不会立即创建线程。使用线程池带来的好处:降低资源的消耗,重复

2021-10-24 20:21:17 150

原创 Synchronized底层原理

Synchronized底层原理synchronized语义是由jvm去实现的对于修饰方法jvm是基于进入和退出monitor。在方法的方法常量池中有一个标记量ACC_SYNCHRONIZED,当是同步方法时jvm读取该标记量,为真就指示去获取monitor。当方法退出的时候,释放monitor。对于修饰代码块jvm也是基于进入和退出monitor的,在代码块开始的地方插入monitorenter,结束的地方插入monitorexit。或者是异常处。jvm保证每个monitorenter都有与之对

2021-09-29 16:03:53 116

原创 单机项目进行微服务拆分

微服务核心就是把传统的单机应用,根据业务将单机应用拆分为一个一个的服务,彻底的解耦,每一个服务都是提供特定的功能,一个服务只做一件事,类似进程,每个服务都能够单独部署,甚至可以拥有自己的数据库。这样的一个一个的小服务就是微服务。那么我先回忆下我现在项目的架构单机架构,用户端和后台管理端放在同一个服务里面。更别提更小的服务:订单服务、商品服务、库存服务、会员服务、支付服务这些精细的。我想如果这个项目要扩展,只能做横向扩展,加机器。微服务架构我准备抽取出,后台管理服务(就是现有的管理端),用户端服务(就是

2022-07-10 20:51:53 649 1

原创 腾讯云服务器配置Elasticsearch集群

设置了两个主节点跑Es,一个节点跑kibana。按照以下步骤是无坑的,一路顺畅。

2022-07-10 16:02:31 809

原创 Mysql死锁相关测试--DEMO

测试用表CREATE TABLE `t` ( `id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, `d` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `id_c` (`c`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;INSERT INTO `t` VALUES ('0', '0', '0');INSERT INTO `t` VALUES ('5',

2022-03-23 12:21:04 1558

原创 实现一个简单的线程池,简单测试可跑通

主要是按照ThreadPoolExecutor的执行流程实现的。实现功能,线程池中线程数 小于 corePoolSize 则直接创建一个线程执行任务。大于则阻塞到阻塞队列。阻塞队列满了 则创建非核心线程执行任务,此时会先执行阻塞队列放不下的那个任务,之后就是超时获取阻塞队列中的任务。非核心线程的超时自动销毁。package ThreeYue;import java.util.concurrent.*;import java.util.concurrent.atomic.AtomicIn

2022-03-15 17:35:31 339

原创 自己实现一个阻塞队列 模仿ArrayBlockingQueue

通过条件队列的等待通知模式来实现 一个基于数组的 有限的阻塞队列package ThreeYue;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;/** * 一个阻塞的FIFO队列 * @param <E> */public class MyBlockingQueue<E> { private ReentrantLock

2022-03-11 16:51:28 180

原创 Java枚举类的原理

学设计模式的时候,看到了单例模式,之前一直都是懒汉模式,饿汉模式,静态嵌套类。没想到还有一个枚举实现的单例。枚举类的原理package ThreeYue;enum Day { MONDAY,TUESDAY,WEDNESDAY}public class Study310 { public static void main(String[] args) { Day day = Day.MONDAY; }}1.对于枚举类 Day 编译器会自动生成一个fina

2022-03-10 10:25:00 313

原创 Java基础之String类

字符串String 可以说是最常用的类一般问题:String类的不可变怎么做到的?为什么?首先String类是由final修饰的,不可被继承。其次String类的char[]数组 是被私有化的,被private修饰,且未提供get()/set()方法。原因:1. String类使用太频繁,所有为了搭配字符串常量池使用。2. 为了线程安全,在多线程环境下 final 可以保证安全3. 为了同一个String类的hashcode唯一,只需要计算一次就缓存了hashcode,方便做为map的ke

2022-02-28 15:42:03 188

原创 submit()和execute()区别原理 通过源代码的区别

之前的一篇线程池 submit()执行怎么获取到的返回值只是讲了怎么使用,还有一部分源码。这篇具体从 提交任务,到具体怎么 传入Runnable 会可以有返回值?并且还涉及线程池中线程怎么执行任务?概念级的区别可以看之前的文章。从submit构造方法开始submit()的出现在ExecutorService,具体实现是它的实现类AbstractExecutorService有三个构造方法<T> Future<T> submit(Callable<T> task

2022-02-28 13:01:08 141

原创 Mysql基础架构+日志系统

涉及内容:基础架构,两种日志redo log 、 binlog,两阶段提交,刷脏策略,日志的持久化策略,undo log日志。Mysql基础架构Mysql可以分为server层和存储引擎层server层: 连接器:校验用户名密码、获取权限 分析器:词法分析、语法分析 优化器:执行计划生成,选择索引 执行器:操作引擎,返回数据存储引擎层: 存储数据,提供读写接口 词法分析:识别出字符串分别是什么、代表什么语法分析:判断sql是否符号Mysql语法

2022-02-25 11:07:31 126

原创 Java中的各种锁和数据库中的锁

Java中的锁公平和非公平锁: 公平锁是指多个线程按照申请锁的顺序来获取锁 非公平锁即打破这个顺序,后来的线程也可以提前获取锁。在ReentrantLock中可以通过改变构造方法参数,变化锁。但是在synchronized,则默认是非公平锁,无法更改。可重入锁和不可重入锁 可重入锁:同一个线程在持有锁的前提下,可以多次获取成功锁。reentrantLock:通过重写AQS的tryacquire方法实现。首先,判断当前是否可以获取锁,不可以再判断当前线程是不是获取了锁的线程。

2022-02-18 23:15:18 1716

原创 Spring基本知识

重要的Spring模块Spring Core:核心模块,主要提供IOC依赖注入功能Spring AOP:面向切面的编程实现Spring JDBC : 连接数据库Spring Web:创建Web程序Spring Test:Junit和TestNG的测试功能Spring WebSocket:很方便实现即使聊天的组件@RestController和@Controller前者:放到一个类上面,代表此类的所有接口返回的是JSON类型的数据。后者:返回一个页面,如果想要某个接口返回JSON数据,

2022-02-07 18:39:37 245

原创 Java网络之Netty学习(2)

Netty执行流程Server启动之后,Netty会从BossEventGroup选出一个NioEventLoop对指定的端口进行监听Client启动后,Netty从NioEventLoopGroup选一个NioEventLoop连接server,连接端口创建Channel服务端从WorkerEventGroup中选择一个NioEventLoop与该channel绑定,之后操作所有与这个通道的操作服务端处理客户端的数据,通过Pipeline中的处理器一次对数据进行处理。Netty重要组件c

2022-02-06 20:14:57 707

原创 Java网络之Netty学习(1)

是什么?是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。基于Nio的特点?高并发,基于Nio的传输快,使用零拷贝,减少不必要的内存拷贝封装好,简化了Nio的API高性能体现:IO线程模型,内存零拷贝,内存池设计,申请的内存可以重复使用,指直接内存,高性能序列化协议。TCP粘包/拆包问题和解决是什么:TCP是基于流进行传输数据,可能把数据拆成几个包。也可能把几个小的数据封装成一个大的包发送粘包就是,小的数据合并一个大的包。拆包就是:大的数据,超过了T

2022-02-02 10:28:58 918

原创 Reactor模式

什么是Reactor模式?一个线程来接收所有请求,然后派发给相应的工作线程中。为什么使用Reactor模式?在Java中,没有NIo之前,都是使用Socket编程。一个线程对应一个请求。这样随着请求过多,线程也会过多。也就限制了高并发。三种Reactor模式三个重要角色:Reactor:负责响应事件,将事件分发到对应的处理器,如果是连接事件则分发到Acceptor。Handler:事件处理器。具体执行程序逻辑Acceptor:处理连接事件,将注册事件进行处理。单Reactor单线程一

2022-02-02 09:51:04 516

原创 Java之NIO基础介绍(二)

三大组件之buffer和selector2. buffer缓存区NIO核心在于通道channel和缓存区buffer。就是channel是用于连接IO设备的,而buffer则是存储数据,缺一不可。channel用来传输,buffer则是存储。buffer是由java.nio定义好的,有不同的实现类。常用的子类都是基本类型出去Boolean类型之外的。xxxBuffer。获取方式都是ByteBuffer bytebuffer = ByteBuffer.allocate(1024);ByteBuff

2022-01-26 15:25:34 305

原创 Java之NIO基础介绍(一)

概念NIO中非阻塞IO采用了基于Reactor的模式。会在Selector中注册某个事件,然后监听通道Channel,当有事件到达才对该事件进行处理。也就是延迟IO核心Selectors、channel、buffers1. channel类比InputStream、OutputStream。是一个层面,面对流的,只不过后者channel是双向的,即可写又可读,所以才是通道。并且双向的前提是,基于随机访问文件RandomAccessFile可读可写访问指针。在Java中Channel的实现pac

2022-01-26 09:38:52 90

原创 Kafka学习-基本概念

Kafka 是什么?主要应用场景有哪些?Kafka是一个消息引擎,和一个分布式的流处理平台。应用场景:1. 消息队列,提供应用程序之间的通信。2,数据处理。Kafka相关术语Topic:主题,生产者发布消息到特定的主题,生产者订阅这个主题获取消息Producer:生产者,生产消息Consumer:消费者,消费消息Broker:一个kafka集群由多个broker组成,broker负责接收客户端(消费者和生产者都是)的请求。Parition:分区,一个Topic有多个分区,并且同一个Topic

2022-01-20 13:53:10 1431

原创 阿里云 Linux 初始化配置一个redis

安装+配置从官网copy一个下载链接 redis.io在Linux任意目录下执行wget https://download.redis.io/releases/redis-6.2.6.tar.gz解压 tar xzvf redis-6.2.6.tar.gz安装cd redis-6.2.6makecd srcmake install PREFIX=/usr/local/redis之前代码为源码目录,现在移动到编译好的目录下移动配置文件cd ../mkdir /us

2022-01-18 20:07:33 189

原创 阿里云 Mysql 初始化全部linux命令

Mysql使用的是阿里云系统镜像,直接有5.7的版本。在root目录下readmo文件中有root用户登陆密码。创建普通用户登陆之后创建一个用户,授予这个用户项目数据库的权限CREATE USER 'user_name'@'host' IDENTIFIED BY 'password';user_name:要创建用户的名字。host:表示要这个新创建的用户允许从哪台机登陆,如果只允许从本机登陆,则 填 ‘localhost’ ,如果允许从远程登陆,则填 ‘%’password:新创

2022-01-17 15:40:27 690

原创 JVM之垃圾回收器和内存分配策略

如何判断一个对象存活?引用计数。对象每被引用一次,计数器值+1.为0时代表对象可回收。缺点:对象相互引用,无法回收可达性分析:从一系列的 GCRoots 开始一个引用链。一个对象无法连接到引用链则可回收(最多二次标记)。GCROOts:虚拟机栈中所引用对象,正在执行的方法中的局部变量、方法参数所引用对象。本地方法栈中所引用对象方法区中类静态变量所引用对象方法区中常量池所引用对象,比如说字符串常量池最多二次标记:如果重写了finalize()方法并且是第一次调用则会加入到一个F队列中,

2022-01-12 15:36:10 137

原创 JVM之内存区域和Java内存模型(JMM)

JVM运行时5个数据区域程序计数器:是什么:是线程私有的,一块小的内存,用来作为当前线程执行字节码的行号指示器。起到的作用:是分支、循环、异常、线程恢复的基础。Java方法,该计数器指示行号;本地方法,该计数器为null虚拟机中唯一不会抛出OOM的内存区域Java虚拟机栈:线程私有的,生命周期与线程相同。是什么:Java方法执行的线程内存模型:每个方法执行的时候都会创建一个栈帧,用于存储局部变量表、操作数栈、方法出口等信息。局部变量表中存储:编译器已知的基本类型,对象引用

2022-01-12 09:16:25 110

原创 Redis的String数据结构详解

对于Redis的String类型的value,采用的是SDS数据结构。但是对于value是8字节的Long类型的value则使用的是int编码。也就是说,这种一对一,非集合类型的value有俩种编码方式。value是Long类型的(只要是数字就行),保存方式是int编码value中有字符,则使用SDS。对于SDS也有两种编码,根据字符串长度区分,小于等于44字节则使用embstr。大于则使用raw编码。SDS结构:元数据(len(4字节,表示已用长度),alloc(4B,表示已分配实际长度大

2022-01-11 16:30:27 915

原创 Redis的一些相关问题

Redis的优点应用维度:数据结构应用、缓存应用、集群应用数据类型:String(动态字符串)、List(双向链表和压缩列表)、Hash(压缩列表和哈希表)、Set(哈希表和整数数组)、Sorted Set(跳表和压缩列表)。缓存:有过期键的淘汰策略(定时删除、定期删除、惰性删除)、有内存不够时处理策略(拒绝新写操作、淘汰旧的键)集群:主从集群(维护多个实例之间的数据一致性)和切片集群(将一个大的实例切片成为多个小的实例)系统维度:高性能、高可靠、高可扩展高性能:多种数据结构,比如说压缩列

2022-01-11 14:34:17 416

原创 Redis快速的原因

Redis 有哪些知识点高可靠:主从复制、哨兵节点、持久化高性能:数据结构、网络架构、持久化、线程模型高可扩展:数据分片、负载均衡Redis基础架构和重要模块访问框架网络访问操作模块 get/set/delete索引模块 基于哈希表存储模块AOFRDB5。高可用:主从复制、哨兵机制高可扩展:数据分片Redis 快速的原因之高效的数据结构String–> SDS 简单动态字符串List --> 双向链表、压缩列表Hash --> 哈希表、压缩

2022-01-11 11:13:52 248

原创 Redis之哨兵机制学习记录

主从复制可以解决集群中数据不一致的情况。但是一主多从。主挂掉之后怎么办?从服务器挂掉还有主服务器和其它的。这就需要哨兵机制来实现主从库自动切换哨兵机制实现主库挂掉之后,的重新选主。有三个具体的点:监控、选主、通知。监控:监控主库、从库。通过心跳检测,发送ping给主从库,无响应则可判断主观下线了。选主:只有主库下线有选主流程。根据从库的状态,选择一个从库作为主库通知:通知其它从库,主库已经变更。通过客户端,主库已变。具体:监控:主观下线:哨兵进程会使用PING来接测主从库和自己之间的网络状况

2022-01-11 09:35:31 223

原创 Redis之主从复制

只使用单机版的redis,只要服务器宕机了,数据恢复期间无法执行新的请求。并且如果服务器磁盘出现故障,那么数据就会丢失。也就是单点故障解决就是多来几个redis,搭一个集群。那么怎么保证多redis之间的数据一致性?数据的读写操作是否每台服务器都可以处理?redis解决的方法就是主从复制机制。主服务器可以执行读写操作,从服务器只能执行读操作,且会接收主服务器的写操作命令,并且执行。这样只在主服务器上面进行写操作。然后同步该操作到其余读服务器,这样就能保证多服务器数据的一致性。重点是同步操作主服务器

2022-01-10 17:33:42 152

原创 Redis之RDB内存快照学习记录

已知AOF是记录每一条写操作命令,之后恢复数据库的时候再把命令都执行一遍。对应的RDB则是记录一瞬间redis数据库的所有数据,以二进制格式记录。这样会恢复的很快。带来的问题:对哪些数据做快照?这关系到快照的执行效率问题;做快照时,数据还能被增删改吗?这关系到 Redis是否被阻塞,能否同时正常处理请求。对哪些数据做快照,怎么做?redis的rdb生成是全量快照,也就是说对所有数据进行快照。恢复的时候很快。但是这样生成的时候就会消耗的时间很大。执行效率就是生成rdb的时候会不会阻塞主线程。主

2022-01-10 11:14:13 421

原创 Redis之AOF日志学习记录

AOFAOF是如何实现的?aof是一个写后日志,就是先写入内存,之后再记录到日志文件中。问题1:为什么先写内存后写入文件?AOF记录文件格式:set "wty" "123345" aof中记录:*2$6SELECT$10//*3 是指有三个部分//$3 是指set占多少字节//之后是命令 set*3$3set$3wty$6123345这些内容在写入文件时候并没有做语法检查,所有先写入内存,之后再写入文件,可用保证记录的命令是正确的。先执行内存写入,再写文件

2022-01-10 10:37:48 642

原创 NC119 最小的K个数 && 剑指 Offer 40. 最小的k个数

不使用原生优先级队列,自己实现一个import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { int len = input.length; for(int i=(k-1)/2;i>=0;i--){ shiftDown(input,i,

2021-12-21 16:29:02 193

原创 线程池 submit()执行怎么获取到的返回值

Java创建线程有三种方法,1是继承Thread类,2是实现Runnable接口,3是实现Callable接口1和2差不多,就是一个是继承关系,继承了Thread类就不能继承其它类的,会有困扰。而实现接口却可实现多个。而且继承Thread类去实现的run方法实际还是Runnable中的run方法前提执行submit()方法会返回一个Future。这个future.get()可以阻塞获取值demo- 21-40 行是创建一个线程池,重点关注42,49,57代码快package study4;i

2021-12-19 17:26:40 3590

原创 Mysql怎么解决幻读问题(innoDB)

Mysql怎么解决幻读问题(innoDB)幻读:在一个事务中,第一次读取的行数和第二次读取的行数不一致。可以见到别的事务新插入的行,并且得是已提交的事务在隔离级别定义中,可重复读级别下是解决不了幻读的。所有innoDB引入了锁机制解决。要知道可重复读级别的实现是MVCC。对于快照读,也就是处于事务中的读来说。只能见到开启事务的一刻数据库的数据状态。另外一个事务新插入的行也是不可见的。实验DEMO,5.7版本的快照读下,部分解决幻读问题数据和索引,id为主键索引事务A第一次快照读下查询数据为

2021-12-11 20:17:54 796

原创 HashMap && HashTable && synchronizedMap&& ConcurrentHashMap 面试常问题

HashMap && HashTable && synchronizedMap&& ConcurrentHashMap 面试常问题开始Collections.synchronizedMap()HashMap是线程不安全的,那么怎么解决线程不安全呢?使用HashTable 代替使用Collections.synchronizedMap() 代替使用ConcurrentHashMap 代替但是,最好用ConcurrentHashMap。

2021-11-18 21:02:51 558

原创 Java单例模式

单例模式Java多线程程序中,有时候需要延迟对象的初始化,降低初始化类和创建对象的开销。而单例模式就提供了这种解决方法。在单例模式中,只允许一个类创建一个对象。所以不能让外部提供构造方法创建它,于是就private SingleDemo(){}且只提供一个对象,则用一个公共方法来获取这一个对象。单例模式有饿汉式,和懒汉式。饿汉式,缺点是提前就进行了对象初始化,资源的浪费,等到需要的时候再初始化,要延迟初始化。但是这也不是一个缺点,如果这个实例初始化耗时很长,我们可以再系统上线前就知道,不用等到

2021-11-17 18:05:52 482

原创 SSL 接收到一个超出最大准许长度的记录。 错误代码:SSL_ERROR_RX_RECORD_TOO_LONG

HTTPS server # nginx配置文件 server { listen 443 ssl; server_name wdestian0918.icu; add_header Content-Security-Policy upgrade-insecure-requests; ssl_certificate my.pem; ssl_certificate_key my.key; ssl_session_cach

2021-11-16 18:07:20 7211

原创 【JUC】 ThreadLocal原理+内存泄漏问题

ThreadLocalThreadLocal是一个线程内部的存储器,存放的元素只能线程自身访问,其余线程访问不了。与Synchronized的比较Synchronized,是依赖与锁机制,在并发情况下,只让一个线程访问共享的变量或者代码块。而ThreadLocal则是为每个线程提供一个变量的副本,使得每个线程在访问的时候访问的都不是同一个对象。应用场景每个线程都要有一个独享的对象,通常是一个工具类。SimpleDateFormat、Random需求:10个线程打印1000个时间,由一个Sim

2021-11-14 20:28:21 817

原创 两线程交替打印1--200 (多种实现+错误代码分析)

两线程交替打印1–200阅读必须了解sychronized的等待通知模式,ReetrantLock的Condition队列。volatile修饰符Semaphore信号量1.使用volatile变量做信号量不使用锁,使用一个volatile变量和AtomicInteger(这个不是必要)import java.util.concurrent.atomic.AtomicInteger;public class TwoThread{ static AtomicInteger num

2021-11-07 22:04:48 470

原创 Mysql 锁相关

Mysql 锁隔离级别和锁在读未提交,读取数据不用加共享锁,读已提交,读操作需要加共享锁,不过在语句执行完释放可重复读,读操作加共享锁,事务提交之前不释放,必须等待事务执行完毕之后释放序列化,锁定整个范围的键,并一直持有锁,直到事务结束锁行级锁,是粒度最小的锁,只对当前操作行加锁,会出现死锁,发生锁冲突概率低表级锁,表示对当前整个表加锁,发生锁冲突概率大,不会出现死锁,并发度最低innodb实现锁的算法record lock ,单个行记录上的锁gap lock 间隙锁,锁定一个范围,

2021-11-06 21:46:20 387

转载 SpringBoot解决(谷歌Chrome) --SameSite属性

转载自 https://springboot.io/t/topic/2602早点看到就好了,按照之前的SpringBoot配置跨域,只有火狐可以通过。谷歌和内核一样的Edge都失败了。也是之前知道谷歌增加了个啥,可以通过配置浏览器解决。但是总不能每访问网站的人都配置自己的浏览器吧今天打开看了一下,发现有个警告Edge报的警告。然后我搜到了这个文章。方法一:服务端设置Set-cookie: key=value; SameSite=None; SecureSet-cookie: key=

2021-11-06 18:30:59 2097

全国城市编码表0.0.0.0

全国城市编码表0.0.0.0

2021-01-25

西邮数据结构课设+校园导航系统.cpp

小白写的渣渣代码,仅供参考使用

2020-12-30

git简介

Git&GitHub_Git简史.avi

2020-12-19

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

TA关注的人

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