自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(188)
  • 资源 (8)
  • 收藏
  • 关注

原创 synchronized底层源码

一、synchronized的使用场景synchronized一般使用在下面这几种场景:修饰代码块,指定一个加锁的对象,给对象加锁public Demo1{ Object lock=new Object(); public void test1(){ synchronized(lock){ } }}修饰静态方法,对当前类的Class对象加锁public class Demo2 { //形式一 public void test1

2022-03-11 10:01:18 973

原创 spring cloud 父子容器加载

Main方法启动SpringBoot调用SpringApplication.run()方法扫描到 BootStrapApplicationListener调用BootStrapApplicationListener#onApplicationEvent()判断enviroment中是否可以取到 “bootstrap” 属性,若有则直接return返回向enviroment塞入 “bootstrap” 标识已经执行过该监听器手动创建新的SpringApplication()并调用run方法扫描.

2022-02-16 10:19:46 183

原创 Sping AOP原理

/*** AOP:【动态代理】* 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式;** 1、导入aop模块;Spring AOP:(spring-aspects)* 2、定义一个业务逻辑类(MathCalculator);在业务逻辑运行的时候将日志进行打印(方法之前、方法运行结束、方法出现异常,xxx)* 3、定义一个日志切面类(LogAspects):切面类里面的方法需要动态感知MathCalculator.div运行到哪里然后执行;*

2022-02-08 15:56:31 54

原创 Spring 事务底层原理

Spring 事务底层原理

2022-02-08 15:51:19 1830

原创 分布式事务的四种解决方案——本地消息表(异步确保)

分布式事务之本地消息表

2022-02-08 14:40:08 4491 2

原创 Spring+MyBatis实现读写分离四种实现方案整理

方案1通过MyBatis配置文件创建读写分离两个DataSource,每个SqlSessionFactoryBean对象的mapperLocations属性制定两个读写数据源的配置文件。将所有读的操作配置在读文件中,所有写的操作配置在写文件中。方案2通过Spring AOP在业务层实现读写分离,在DAO层调用前定义切面,利用Spring的AbstractRoutingDataSource解决多数据源的问题,实现动态选择数据源方案3通过Mybatis的Plugin在业务层实现数据库读写分离,在MyB

2022-03-11 15:59:29 1573

原创 synchronized修饰static方法与非static方法的区别

当synchronized修饰一个static方法时,多线程下,获取的是类锁(即Class本身,注意:不是实例),作用范围是整个静态方法,作用的对象是这个类的所有对象。当synchronized修饰一个非static方法时,多线程下,获取的是对象锁(即类的实例对象),作用范围是整个方法,作用对象是调用该方法的对象。结论:类锁和对象锁不同,他们之间不会产生互斥。public class SynchoronizedDemo { //synchronized修饰非静态方法 pu..

2022-03-11 09:39:06 970

转载 linux下tcp服务器并发连接数限制

1、修改用户进程可打开文件数限制在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄)。可使用ulimit命令查看系统允许当前用户进程打开的文件数限制:[speng@as4 ~]$ ulimit -n1024这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进程必然打开的

2022-03-10 15:31:12 2400

原创 ThreadLocal源码

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typic

2022-03-10 09:32:35 64

转载 MVCC详解

正确的理解MySQL的MVCC及实现原理多版本控制: 指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行,这样大幅度提高了InnoDB的并发度。在内部实现中,与Postgres在数据行上实现多版本不同,InnoDB是在undolog中实现的,通过undolog可以找回数据的历史版本。找回的数据历史版本可以提供给用户读(按照隔离级别的定义,有些读请求只能看到比较老的数据版本),也可以在回滚的时候覆盖数据页上

2022-03-05 14:38:49 90

转载 innodb三大特性

InnoDB的三个关键特性InnoDB存储引擎的三个关键特性:插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)。1、插入缓冲(insert buffer)的原理:对于非聚集索引的插入和更新,不是每一次直接插入索引页中,而是首先判断插入的非聚集索引页是否在缓冲池中,如果在,则直接插入,否则,先放入一个插入缓冲区中。好似欺骗数据库这个非聚集的索引已经插入到叶子节点了,然后再以一定的频率执行插入缓冲和非聚集索引页子节点的合并

2022-03-05 09:19:30 745

转载 Redis 性能优化

Redis 是基于单线程模型实现的,也就是 Redis 是使用一个线程来处理所有的客户端请求的,尽管 Redis 使用了非阻塞式 IO,并且对各种命令都做了优化(大部分命令操作时间复杂度都是 O(1)),但由于 Redis 是单线程执行的特点,因此它对性能的要求更加苛刻,本文我们将通过一些优化手段,让 Redis 更加高效地运行。本文我们将使用以下手段,来提升 Redis 的运行速度:缩短键值对的存储长度;使用 lazy free(延迟删除)特性;设置键值的过期时间;禁用长耗时的查询命令;使用

2022-03-05 09:01:54 172

原创 redis 过期策略

redis是单线程,收割时间也会占用线程处理时间,如果收割过于频繁,会导致读写出现卡顿。1、主库过期策略1.1、定时扫描首先将每个设置了过期时间的key放到一个独立的hash中,默认每秒定时遍历这个hash而不是整个空间:并不会遍历所有的key,采用一种简单的贪心策略1.1.1、从过期key字典中,随机找20个key。1.1.2、删除20gekey中过期的key1.1.3、如果2中过期的key超过1/4,则重复第一步1.1.4、每次处理的时间都不会25ms如果有大量的key在同一时间段内过

2022-03-05 08:51:32 125

原创 一致性哈希算法的原理与实现

https://blog.csdn.net/kefengwang/article/details/81628977https://blog.csdn.net/qq_31601743/article/details/89477787对于 K 个关键字和 n 个槽位(分布式系统中的节点)的哈希表,增减槽位后,平均只需对 K/n 个关键字重新映射。...

2022-03-05 08:51:03 108

原创 哪些是线程安全的容器?

同步容器类:使用了synchronized 1.Vector 2.HashTable并发容器: 3.ConcurrentHashMap:分段 4.CopyOnWriteArrayList:写时复制 5.CopyOnWriteArraySet:写时复制Queue: 6.ConcurrentLinkedQueue:是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。 (java.util.concurrent.BlockingQueue 接口代表了线程安全的队列。) 7.ArrayBloc

2022-03-05 08:50:24 713

转载 Spring事务回滚和异常类

1、异常的一些基本知识异常的架构  异常的继承结构:Throwable为基类,Error和Exception继承Throwable。Error和RuntimeException及其子类成为未检查异常(unchecked),其它异常成为已检查异常(checked)。 Error异常Error表示程序在运行期间出现了十分严重、不可恢复的错误,在这种情况下应用程序只能中止运行,例如JAVA 虚拟机出现错误。Error是一种unchecked Exception,编译器不会检查Error是否被处理,在

2022-03-05 08:49:47 2015

原创 rabbitmq五种工作模式

1、简单模式在这里插入图片描述1个生产者将消息交给默认的交换机(AMQP default)2 交换机获取消息后交给绑定这个生产者的队列(关系是通过队列名称完成)3 监听当前队列的消费者获取消息,执行消费逻辑应用场景:短信,聊天2、工作模式(资源争抢)1 生产者将消息交个交换机2 交换机交给绑定的队列3 队列由多个消费者同时监听,只有其中一个能够获取这一条消息,形成了资源的争抢,谁的资源空闲大,争抢到的可能越大;应用场景:抢红包,大型系统的资源调度3 发布订阅(publish/fanou

2022-03-05 08:05:32 3108

原创 Spring 中事务方法的调用

前言Spring 提供了事务的管理机制,我们只需要在方法或者类上加上 @Transactional 注解进行事务管理。而非事务方法与事务方法之间相互调用,有时会使事务失效,本文是对该情形下的事务总结什么是事务传播机制事务在多个方法的调用中是如何传递的,是重新创建事务还是使用父方法的事务?父方法的回滚对子方法的事务是否有影响?这些都是可以通过事务传播机制来决定的。Spring 默认是 PROPAGATION_REQUIRED 机制。 下面来举一个例子: public class Demo {

2022-03-05 07:56:45 4275

原创 LeetCode-344-反转字符串

一、双指针class Solution { public void reverseString(char[] s) { int n = s.length; for (int left = 0, right = n - 1; left < right; ++left, --right) { char tmp = s[left]; s[left] = s[right]; s[right] =

2022-03-02 14:54:07 61

原创 反转二叉树

1.递归版本/** * LeetCode 226 - Invert Binary Tree */public class Solution { /** * 翻转二叉树 * @param root 二叉树的根 * @return */ public TreeNode invertTree(TreeNode root) { if (root == null) { return root; }

2022-03-02 14:43:37 175

原创 rabbitmq 怎么保证幂等性,数据一致性问题

mq的作用主要是用来解耦,削峰,异步,增加MQ,系统的复杂性也会增加很多,也会带来其他的问题,比如MQ挂了怎么办,怎么保持数据的幂等性幂等性问题通俗点讲就是保证数据不被重复消费,同时数据也不能少,也就是数据一致性问题。下面是MQ丢失的3种情况1,生产者发送消息至MQ的数据丢失解决方法:在生产者端开启comfirm 确认模式,你每次写的消息都会分配一个唯一的 id,然后如果写入了 RabbitMQ 中,RabbitMQ 会给你回传一个 ack 消息,告诉你说这个消息 ok 了2,MQ收到消

2022-03-02 14:32:08 1546

原创 springboot 静态方法获取Bean

实现ApplicationContextAwareApplicationContextAware 通过它Spring容器会自动把上下文环境对象调用ApplicationContextAware接口中的setApplicationContext方法。我们在ApplicationContextAware的实现类中,就可以通过这个上下文环境对象得到Spring容器中的Bean。看到—Aware就知道是干什么的了,就是属性注入的,但是这个ApplicationContextAware的不同地方在于,实现了这个

2022-03-02 14:23:42 586

原创 JVM配置信息

首先先看一下jvm的结构图从上图可以看出jvm的内存主要分了三个部分:堆内存,永久代,栈。对于堆内存和永久代这个是线程共享的。堆内存(Heap)对于大多数应用来说,Java 堆(Java Heap)是Java 虚拟机所管理的内存中最大的一块。Java 堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。堆内存是所有线程共有的,可以分为两个部分:年轻代和老年代。下图中的Perm代表的是永久代,但是注意永久代并不属于堆内

2022-03-02 14:03:58 90

原创 jstack Dump 日志文件中的线程状态

dump 文件里,值得关注的线程状态有:1、死锁,Deadlock(重点关注)死锁线程,一般指多个线程调用间,进入相互资源占用,导致一直等待无法释放的情况。2、执行中,Runnable一般指该线程正在执行状态中,该线程占用了资源,正在处理某个请求,有可能正在传递SQL到数据库执行,有可能在对某个文件操作,有可能进行数据类型等转换。3、等待资源,Waiting on condition(重点关注)1、如果堆栈信息明确是应用代码,则证明该线程正在等待资源。一般是大量读取某资源,且该资源采用了资源锁的

2022-03-02 13:58:24 187

原创 定位慢查询的两种方法以及使用explain分析SQL

定位慢查询。使用explain分析。在平时工作中,我想你肯定遇到过一条sql发出去了,但是等了好久才出现了返回值,这不仅仅影响了测试速度也大大降低了开发效率。所以我们有必要学习sql慢查询定位。一般定位慢查询会有两种解决方案:根据慢查询日志定位使用show processlist定位,查询正在执行的慢查询NO.1 慢查询日志定位解析MySQL 的慢查询日志记录的内容是:在 MySQL 中响应时间超过参数 long_query_time(单位秒,默认值 10)设置的值并且扫描记录数不小于 mi

2022-03-02 13:37:31 326

转载 rabbimq如何保证数据安全性

一. 持久化RabbitMQ支持消息的持久化,也就是数据写在磁盘上。(1)exchange持久化,在声明时指定durable => 1(2)queue持久化,在声明时指定durable => 1(3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化)注意:如果消息持久化,queue不持久化,重启服务消息依然会丢失,但是exchange不持久化就不会有影响,所以在持久化消息的同时一定要持久化queue;二. ACK上面持久化保证了队列里的数据在服务器出

2022-03-02 13:17:32 555

原创 java多线程正确关闭的方法

假如说有两个线程,其中有一个线程对一块内存加了锁,那么另一个线程再同样访问这块内存时候就会被堵塞,一旦前一个线程暂停了,那么就凉了。假如说有两个线程,其中有一个线程在写数据的时候突然停止了,那么这块数据还可能未来的及清理,后者线程去操作内存就会出现异常,那么也凉了。结束线程并非是本意,实则是结束任务。只要任务结束那就结束了。那么中断的方法一般采用interrupt或boolean标志位判断线程是否中止采用isInterrupted,如果线程中有Thread.sleep方法,当设置中断后,执行这个方

2022-03-02 13:07:19 3487

原创 JAVA可重入锁死锁

可重入锁可重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。synchronized 和 ReentrantLock 都是可重入锁。可重入锁的意义之一在于防止死锁。实现原理实现是通过为每个锁关联一个请求计数器和一个占有它的线程。当计数为0时,认为锁是未被占有的;线程请求一个未被占有的锁时,JVM将记录锁的占有者,并且将请求计数器置为1 。如果同一个线程再次请求这个锁,计数器将递增;每次占用线程退出同步块,计数器值将递减。直到计数器

2022-03-02 13:01:39 474

转载 路由算法(网络层)

引言网络层的主要功能是将数据包从源机器路由到目标机器。在大多数是网络中,数据包需要多跳才能到达目的地。唯一一个值得指出的例外是广播网络,但即使在广播网络中,如果源机器和目标机器不在同一个网络段中时,路由仍然是一个问题。选择路由的算法以及这些算法所用的数据结构是网络层设计的最主要内容。路由算法是网络层软件的一部分,它负责确定一个入境数据包应该被发送到哪一条输出线路上。如果网络内部使用了数据报,那么路由器必须针对每一个到达的数据包重新选择路径,因为自上一次选择了路径之后,最佳路径可能已经发生了改变。如果网络

2022-02-27 10:53:38 2073

原创 REDIS SLOWLOG(慢日志)

slowlog 此命令用于读取和重置Redis慢查询日志。一、Redis slowlog 官方概述:Redis Slow Log是一个用于记录超过指定执行时间的查询的系统。执行时间不包括与客户端交谈,发送答复等I / O操作,而仅包括实际执行命令所需的时间(这是命令执行的唯一阶段,在该阶段线程被阻塞并且不能同时满足其他要求)。通俗的讲使用这个命令可以读取或重置 Redis 慢速查询日志。就是 redis 可以把执行时间超过我们设定值的命令记录下来,slowlog 是记录到内存中的,所以查询非常快。这里

2022-02-24 15:36:52 1547

原创 JAVA获取时间戳三种方法及效率

目前获取毫秒值大概有下面三种方法//方法 一 System.currentTimeMillis(); //方法 二 Calendar.getInstance().getTimeInMillis(); //方法 三 new Date().getTime();到底哪个更快呢?然后做了如下实验:import java.util.Calendar; import java.util.Date; public class TimeTest {

2022-02-21 09:33:07 1346

原创 Java日志框架SLF4J和log4j以及logback的联系和区别

1.SLF4J(Simple logging Facade for Java)意思为简单日志门面,它是把不同的日志系统的实现进行了具体的抽象化,只提供了统一的日志使用接口,使用时只需要按照其提供的接口方法进行调用即可,由于它只是一个接口,并不是一个具体的可以直接单独使用的日志框架,所以最终日志的格式、记录级别、输出方式等都要通过接口绑定的具体的日志系统来实现,这些具体的日志系统就有log4j,logback,java.util.logging等,它们才实现了具体的日志系统的功能。如何使用SLF4J?既

2022-02-18 15:02:27 195

转载 如何解决Redis缓存与MySQL的数据一致性

懒加载延迟双删在写库前后都进行redis.del(key)操作,并且第二次删除通过延迟的方式进行。方案一(一种思路,不严谨)具体步骤是:1)先删除缓存;2)再写数据库;3)休眠500毫秒(根据具体的业务时间来定);4)再次删除缓存。那么,这个500毫秒怎么确定的,具体该休眠多久呢?需要评估自己的项目的读数据业务逻辑的耗时。这么做的目的,就是确保读请求结束,写请求可以删除读请求造成的缓存脏数据。当然,这种策略还要考虑 redis 和数据库主从同步的耗时。最后的写数据的休眠时间:则在读数据业

2022-02-18 14:31:48 277

原创 设计模式基本概念

设计模式有哪些原则开闭原则:OOP 中最基础的原则,指一个软件实体(类、模块、方法等)应该对扩展开放,对修改关闭。强调用抽象构建框架,用实现扩展细节,提高代码的可复用性和可维护性。单一职责原则:一个类、接口或方法只负责一个职责,降低代码复杂度以及变更引起的风险。依赖倒置原则:程序应该依赖于抽象类或接口,而不是具体的实现类。接口隔离原则:将不同功能定义在不同接口中实现接口隔离,避免了类依赖它不需要的接口,减少了接口之间依赖的冗余性和复杂性。里氏替换原则:开闭原则的补充,规定了任何父类可以出现的地方子

2022-02-17 15:32:00 178

原创 关于数字图像技术的一些思考

一直都说写点什么,但是总是没有,其中很重要的原因关于一些行业思考很多但是都没有系统的去总结。总是给自己借口:如果一个人有话说,那么会自然而然的出来。然而个人经历告诉我不是这样的,任何观点技能都是我们不断练习总结才会不断提高。今天就尝试阐述一下我对视频安防行业的一些理解。首先计算机发展到今天我们很大一部分内容仍然都只是在解决信息流动资源分配提高效率的问题;像目前支付互联网金融

2022-02-17 10:47:33 65

原创 Netty源码分析之NioEventLoop

本文分析Netty的NioEventLoop是如工作的。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ENfGVW05-1644982158935)(//upload-images.jianshu.io/upload_images/2184951-2e248d85df2a1a86.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/490/format/webp)]NioEventLoop中维护了一个线程,线程启动时会调用

2022-02-17 10:45:15 86

原创 java并发编程

1、原子性一个或者多个操作,要么全部执行并且在执行的过程中不被其他操作打断,要么就全部都不执行2、可见性多个线程操作一个共享变量时,其中一个线程对变量进行修改后,其他线程可以立即看到修改的结果3、有序性程序的执行顺序按照代码的先后顺序来执行...

2022-02-17 10:11:14 102

原创 JAVA并发编程——守护线程(Daemon Thread)

在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。用户线程和守护线程两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在

2022-02-17 09:54:59 180

原创 Mybatis中使用的10种设计模式

Mybatis至少遇到了以下的设计模式的使用:1、Builder模式,例如SqlSessionFactoryBuilder、XMLConfigBuilder、XMLMapperBuilder、XMLStatementBuilder、CacheBuilder;2、工厂模式,例如SqlSessionFactory、ObjectFactory、MapperProxyFactory;3、单例模式,例如ErrorContext和LogFactory;4、代理模式,Mybatis实现的核心,比如MapperPr

2022-02-17 09:41:22 750

原创 JVM内存相关原则

JMM 规定所有变量都存储在主内存,每条线程有自己的工作内存,工作内存中保存被该线程使用的变量的主内存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。不同线程间无法直接访问对方工作内存中的变量,线程通信必须经过主内存。关于主内存与工作内存的交互,即变量如何从主内存拷贝到工作内存、从工作内存同步回主内存,JMM 定义了 8 种原子操作:操作作用变量范围作用lock主内存把变量标识为线程独占状态unlock主内存释放处于锁定状态的变量read

2022-02-17 09:40:41 54

软考 系统分析师论文 范文

系统分析师考试 论文范文 涵盖十大类主题 一、软件开发方法 二、需求分析 三、软件设计 四、软件测试与性能 五、软件维护 六、数据库技术 七、计算机网路与信息安全 八、软件项目管理 九、企业应用集成 十、新技术应用

2019-03-26

系统集成项目管理工程师全套资料

系统集成项目管理工程师全套资料 已经考过了,分享给大家

2018-12-18

系统架构设计师 2009~2017历年真题及答案

系统架构设计师考试 2009~2017历年真题及答案 软考 高级 必备材料

2018-09-13

人月神话 中文可编辑版 英文20周年影印版

人月神话 中文可编辑版 英文20周年影印版 软件工程必读

2018-09-13

系统集成项目管理工程师教程 pdf 可编辑版

系统集成项目管理工程师教程 pdf 可编辑版  

2018-08-31

系统集成项目管理工程师 知识点 打印 背诵版

系统集成项目管理工程师 知识点 打印 背诵版 包含历年考点归纳总结

2018-08-31

史上最全 visual studio code 快捷键 mac 版

史上最全 visual studio code 快捷键 mac 版

2018-08-31

中国移动通信电源系统工程设计规范

中国移动通信电源系统工程设计规范 QB-J-01-2013 通信电源资料

2018-08-29

空空如也

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

TA关注的人

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