自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(30)
  • 资源 (4)
  • 收藏
  • 关注

原创 HashMap深入浅出的理解

HashMap存储数据方式:K,V底层存储:数组加链表结构什么是数组?数组:采用连续的数据单元来存储数据数组结构的特点:查询速度比较快,插入速度很慢。 那为什么插入速度慢呢? 因为:当你插入,删除数据的时候,底层数组会发生变化假如你把 2 这个节点删除掉后,后面的节点会向前移位,如果不移位局断开了,所以插入,删除很慢链表:非连续,非顺序的数据结构特点:插入快,查询比较慢HashMap存储数据: 数据存储位置是根据 map中的K 去调用hash散列算法生成一个h..

2020-06-14 15:19:38 163

原创 Java后端如何保证接口幂等性

Java后端如何保证接口幂等性。

2024-07-30 16:19:13 168

原创 分布式事务

在分布式系统中一次操作由多个系统协同完成,这种一次事务操作涉及多个系统通过网络协同完成的过程称为分布式事务。这里强调的是多个系统通过网络协同完成一个事务的过程,并不强调多个系统访问了不同的数据库,即使多个系统访问的是同一个数据库也是分布式事务,如下图:另外一种分布式事务的表现是,一个应用程序使用了多个数据源连接了不同的数据库,当一次事务需要操作多个数据源,此时也属于分布式事务,当系统作了数据库拆分后会出现此种情况。上面两种分布式事务表现形式以第一种据多。

2023-06-13 16:20:33 161

原创 消息队列在项目中的使用

背景:在分布式系统中是如何处理高并发的。由于在高并发的环境下,来不及同步处理用户发送的请求,则会导致请求发生阻塞。比如说,大量的insert,update之类的请求同时到达数据库MYSQL,直接导致无数的行锁表锁,甚至会导致请求堆积很多。从而触发 too many connections 错误。使用消息队列可以解决【异步通信】

2023-06-06 19:32:43 129

原创 死锁编码及定位分析

死锁是指两个或者两个以上的进程在执行过程中,因争夺资源而造成的一种相互等待的现象,若无外力干涉将无法推进下去,如果系统资源充足,进程资源都能够满足,死锁出现的可能性就很低,否则就会因争夺资源而陷入死死锁 Linux ps -ef | grep XXX ls -l Windows 下java运行程序也有类似于ps 查看进行的命令但是目前我们需要查看的是 java jps = java ps jps -l 找到出现问题的进程号 8804...

2022-06-14 16:46:50 175

原创 如何合理配置线程数?

CPU密集型的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行CPU密集型任务只有真正的多核CPU上才能进行加速(通过多线程)在单核CPU上(悲剧,无论你开几个模拟多线程任务,都不可能得到加速,因为CPU总的运算能力就那些)CPU密集型配置任务尽可能的减少线程数量:一般公式CPU核数+1个线程的线程池1.IO密集型任务线程并不是一直在执行任务,则应配置尽可能多的线程如CPU核数*2...

2022-06-12 16:56:26 368

原创 线程池底层工作原理

解析:使用者就是来银行办理业务的老头老太太们,首先核心数就是corePoolSize,没有满,两个窗口就来了一个顾客,满了之后去候客区等着去阻塞队列,如果候客区椅子很多,阻塞对列没有满,就等着,等着,但是抱歉,候客区(阻塞对列也满了)也满了,马工和行长反应情况,多来几个人加个班,这个时候就是我们刚才所说的从2个线程扩展到5个线程,线程池是否达到最大数,没有满继续干活,满了执行拒绝策略就这四步......

2022-06-11 18:03:16 283

原创 线程池的7大参数

1.1 线程中长驻的核心线程 1.2 当核心线程中的线程数量达到corePoolSize之后就会把任务放到缓存队列 2.1线程池中能够容纳同时执行的线程最大数,此值必须大于等于1 3.1 多余的空闲线程存活时间,当前线程数超过 corePoolSize 时,当空闲时间达到keepAliveTime时多余的空闲线程会被销毁,直到剩到corePoolSize为止 4.1 keepAliveTime的单位 5.1队列任务,被提交但尚未被执行的任务 6.1 表示生成线程池中工作线程的线

2022-06-10 19:02:40 2296

原创 线程池的3个常用方式

Java中的线程池是通过 Executor来实现的,该框架用到了Executor,Executors,ExecutorService,ThreadPoolExecutor

2022-06-10 17:27:28 148

原创 第三种获得多线程的方式Callable

1.创建线程 Callable的出现一定是弥补前两种创建线程的缺陷 例如做流水账业务,启动一千个线程,我需要知道每个支付的结果,传统创建线程方式,出现错误异常,并不知道返回值,Callable可以弥补缺陷 Callable采用了适配器模式,new Thread()中传入 Runnable接口...

2022-06-09 18:12:32 82

原创 为什么需要阻塞队列 BlockingQueue?

1.好处我们不需要关心什么时候需要阻塞线程,什么时间需要唤醒线程,因为一切BlockingQueue一手操办了 在JUC包以前多线程环境下,我们每个程序员,必须自己去控制这些细节,尤其兼顾效率和线程安全,而这会给我们程序带来不小复杂度.....package com.queue;import ch.qos.logback.core.util.TimeUtil;import java.util.concurrent.ArrayBlockingQueue;import java.uti

2022-05-30 00:56:11 142

原创 Synchronized与Lock有什么区别?

1.原始构成Synchronized是关键字属于JVM层面monitorenter(底层通过monitor对象来完成,其实wait/notify等方法也依赖于monitor对象只有在同步块或方法中才能调用wait/notify 等方法 monitorexitLock是JUC下API层面下的锁package com.concurrent;import java.util.concurrent.locks.ReentrantLock;/** * synchronized 与 Re

2022-05-29 19:14:34 80

原创 java阻塞队列BlockingQueue

1.什么是阻塞队列?2.为什么用,有什么好处?3.BlockingQueue的核心方法

2022-05-29 16:46:07 203

原创 JVM 内存模型一篇吃透

1.结构2.各部分介绍3.栈管运行,堆管存储package com.jvm;public class StackDemo { public static void testStack(){ testStack(); } public static void main(String[] args) { testStack(); System.out.print...

2022-05-24 17:27:54 100

原创 MySql优化一篇就够了

1.存储引擎1.1Mysql逻辑架构介绍和其它数据库相比,MySQL有点与众不同,它的架构可以在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统任务以及数据的存储提取相分离。这种架构可以根据业务的需求和实际需要选择合适的存储引擎。1.连接层最上层是一些客户端和连接服务,包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池.

2022-05-13 20:49:09 208

原创 Semaphore使用以及原理

1. Semaphore的使用1) Semaphore,俗称信号量 基于AbstractQueuedSynchronizer实现!AQS2) Semaphore管理着一组许可permit,许可的初始数量通过构造函数设定。3) 默认使用非公平的方式 sync = new NonfairSync(permits); 使用Semaphore可以控制同时访问资源的线程个数,例如,实现一个文件允许的并发访问数4) 当线程要访问共享资源时,需要先通过acquire()方法获取许可。获取到之后许可

2022-05-08 18:49:45 2097

原创 CyclicBarrier 使用介绍

1.CyclicBarrier介绍与 CountDownLatch相反的CyclicBarrier是做加法,例如集齐7颗龙珠才可以召唤神龙,少一个龙珠都会失败2.上代码案例演示package com.concurrent;import java.util.concurrent.CyclicBarrier;/** * */public class CyclicBarrierDemo { public static void main(String[] args).

2022-05-08 17:11:05 112

原创 CountDownLatch简单使用

1.描述CountDownLatch的出现解决不是偶然,也为了解决之前线程之间出现的一些问题例如下面的代码案例:public class CutDownLatchDemo { public static void main(String[] args) throws Exception { closeDoor(); } public static void closeDoor() throws InterruptedException {

2022-05-08 16:45:16 378

原创 一篇学会Redis 集群使用相关配置资料

1.今日大纲1.Redis的持久化2.Redis的主从3.Redis的集群2.Redis的持久化2.1持久化,就是将数据保存到磁盘,机器宕机或者重启数据不丢失,如果存储到内存中的数据,会丢失。2.22.2.12.2.22.2.3RDB数据恢复过程2.2.4 快照过程2.2.5 手动快照如果没有触发自动快照,需要对redis执行手动快照操作,SAVE和...

2022-05-04 01:21:42 230

原创 常见集合类ArrayList、Set、Map不安全问题出现原因以及解决方案

package com.example.demo;import java.util.*;import java.util.concurrent.CopyOnWriteArrayList;/** * @date 2022/5/1 * @apiNote *//** * 集合类ArrayList不安全问题出现原因以及解决方案 */public class ArrayListDemo { public static void main(String[] args) { .

2022-05-01 18:37:57 558

原创 CAS核心原理

AtomicInteger atomicInteger1 =new AtomicInteger(5);//主物理内存的初始值也就是5var1 就是AtomicInteger对象本身var2就是对象值的引用地址,也就是内存地址偏移量var4需要变动的数量,也就是这里的1var5是用var1,var2找出主内存的真实地址用该对象和var5进行比较如果相同 更新var5+var4 返回true如果不同然后继续比较,直到更新成功完成...

2022-04-27 16:07:33 244

原创 在IntelliJ IDEA中使用.ignore插件忽略Git不必要提交的文件

第一步点击File->Settings,在左侧菜单找到Plugins,点击搜索栏搜索.ignore,点击Install第二步在项目上右键->New ->.ignore file ->.gitignore file(Git)第三步先选择Example user template好了,以后有什么想过滤的可以自行添加,~最后点击Generate生成第四步.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳.

2022-04-21 14:45:01 8223

原创 Java中常见的锁----->读写锁

独占锁指该锁一次只能被一个线程所持有对于ReentrantLock和synchronized而言都是独占锁共享锁指该锁可以被多个线程所持有对ReentrantReadWriteLock而言其读锁是共享锁,读锁是独占锁读锁共享锁可保证并发读是非常高效的,其中读写,写读,写写是互斥的...

2022-04-20 18:04:27 3617

原创 Java中常见的锁----->自旋锁

自旋锁是指尝试获取锁的线程不会立即被阻塞而是采用循环的方式去获取锁,这样的好处是减少上下文切换消耗,缺点是循环会消耗CPU...Unsafe public final int getAndAddInt(Object var1, long var2, int var4) { int var5; do { var5 = this.getIntVolatile(var1, var2); } while(!this.compa

2022-04-19 17:45:20 244

原创 JAVA中常见的锁------>可重入锁

可重入锁指的是通过线程外层函数获得锁之后,内层递归函数仍然能够获得该锁的代码,在一个线程外层方法获取锁的时候,在进入内层方法自动获取锁。也就是说,线程可以进入任何一个已经拥有的锁所同步着的代码块ReentranLock/Synchronized就是一个很典型的可重入锁,作用避免死锁上代码package com.example.demo;class Phone{ public synchronized void SendSMS() throws Exception {

2022-04-19 16:52:27 666

原创 SpringBoot启动流程及其原理

1.springboot的启动类入口@SpringBootApplication@ComponentScan(basePackages ={"cn"})public class SpringBootDemo { public static void main(String[] args) { SpringApplication.run(SpringBootDemo.class); }}可以看出,Annotation定义(@SpringBootApplicati

2022-02-23 15:39:01 1610

原创 SpringBoot+Mybatis实现简单分页查询

自己动手实现SpringBoot+Mybatis实现分页查询

2022-02-17 18:51:42 1484

原创 HashMap为什么不是线程安全的

第一步,我们来看一下 HashMap 中 put 方法的源码:publicVput(Kkey,Vvalue){if(key==null)returnputForNullKey(value);inthash=hash(key.hashCode());inti=indexFor(hash,table.length);for(Entry<K,V>e=table[i];e!=null;e=...

2020-12-24 15:46:00 147

原创 Java实现自定义任务调度

第一步获取该数据库中可以执行的任务,初始化加载任务@Componentpublic class InitMethond implements InitializingBean{ @Autowired private SchedulerManager schedulerManager; @Autowired private TaskService taskService; @Override public void after...

2020-06-16 00:46:33 1048

原创 面向切面编程AOP记录日志操作实现

Spring AOPOOP缺陷:在我们日常开发中常见Controller------>Service------>Dao------>数据库 自上而下的调用方式 这之中存在许多的缺陷和不足,我们在记录某个方法的操作详情时候,每个方法都要写对应的操作与业务逻辑结合,导致代码很臃肿耦合度很高。这个时候SpringAOP应运而生来解决我们出现的问题。AOP应用场景:日志操作记录,权限,事务

2020-06-14 16:44:50 296

MySql面试精讲图谱

MySql面试精讲图谱

2022-05-12

代码反编译工具jd-gui-0.3.3.windows

源码反编译,可以查看Java class文件源码

2022-05-05

JDK1.8 java API 英文版

JDK1.8 java API 英文版

2022-05-01

Mybatis代码生成器

日常开发对于常见的CURD费时费力,Mybatis代码生成器完美解决了Dao层,Entity实体类,Mapper配置文件的书写,从另一方面提升代码的开发效率.....

2022-02-22

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

TA关注的人

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