自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 五分钟带你搞懂Springmvc的运行流程图

Springmvc的运行流程图

2023-12-18 14:31:05 396

原创 常量池 及 String & intern()方法在jdk6 7 8中区别与联系

jdk>=7:则是将字符串本身在常量池中查找,如果有,则返回常量池中的引用,这里没有变化,如果没有则会将堆中的引用传递给常量池,然后返回这个指向堆的引用。a 字符串其实可以存储在两个地方,池和堆中都有存储,否则也不会出现intern这个方法去常量池中找有没有这个字符串,那说明有的字符串根本就不在池中。jdk

2023-09-28 16:33:03 97

原创 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看

我们知道,hashCode()方法继承自父类Object,它返回的是一个 int 类型的数值,可以保证同一个应用单次执行的每次调用,返回结果都是相同的(这个说明可以在hashCode源码上找到),这就保证了hash的确定性。关于这一点的解释,我发现网上文章抄来抄去的,而且都来自左耳朵耗子,更惊奇的是,连配图都是一模一样的。别扯犊子了,两个值怎么做非运算。计算中的18,34 ,50 其实就相当于 e.hash 值,和新旧数组做取模运算,得到的结果,要么就是原来的位置不变,要么就是原来的位置加上旧数组的长度。

2023-09-15 19:16:30 87

原创 模拟跨域请求

chrome浏览器F12调出开发者工具,在开发者工具界面如下:var xhr = new XMLHttpRequest();xhr.open('GET', 'https://www.xxx.com/api/action');xhr.send(null);xhr.onload = function(e) { var xhr = e.target; console.log(xhr.responseText);}...

2022-03-22 11:56:57 1544

原创 【冒泡排序】

public class HelloWorld { public static void main(String []args) { int a[] = {5,4,3,2,1};// int x = 0; for (int i = 0; i < a.length; i++) { for (int j = 0; j < a.length-i-1; j++) {// System.out.print("[第" + (++x) + "次:" + a[j] + "与"

2021-12-27 17:36:49 200

原创 MySQL行锁、表锁、间隙锁gap、next-key锁

你需要知道的之前我们介绍了排他锁,其实innodb下的记录锁(也叫行锁),间隙锁,next-key锁统统属于排他锁。行锁记录锁其实很好理解,对表中的记录加锁,叫做记录锁,简称行锁。生活中的间隙锁编程的思想源于生活,生活中的例子能帮助我们更好的理解一些编程中的思想。生活中排队的场景,小明,小红,小花三个人依次站成一排,此时,如何让新来的小刚不能站在小红旁边,这时候只要将小红和她前面的小明之间的空隙封锁,将小红和她后面的小花之间的空隙封锁,那么小刚就不能站到小红的旁边。这里的小红,小明,小花,小刚

2021-12-02 21:09:45 1326

原创 spring的@Transactional注解详细用法

概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用提供比其他事务API如JTA更简单的编程式事务管理API

2021-12-02 14:52:05 591

原创 java对象头与synchronized锁的升级过程

java对象头中都存了些什么?32位jdk中:64位jdk中:在javaSE1.6中,为了减少上下文切换带来的性能消耗,jdk引入了偏向锁与轻量锁synchronized锁保证线程安全时锁的升级过程偏向锁: 由于重量级锁在每次释放与获取锁时进行上下文切换对性能消耗大,而多数锁的获取与释放常常在同一个线程中进行,针对该现象引入了偏向锁进行优化;当一个线程访问同步代码块并获取锁时,会在对象头和栈帧中的所记录里存储偏向锁的线程ID,以后该线程在进入和退出同步代码块时,不用进行CAS操作来加锁解锁,只

2021-12-01 19:07:53 335

原创 解决RSA速度慢的问题 | RSA - 与DES结合使用实现动态加密

原文转自:https://blog.csdn.net/liuguocheng/article/details/38401601先随机产生一个RSA公钥和私钥客户端:每次传送信息随机产生一个 DES key,对信息直接用key进行加密传输 ,然后用公钥对key进行加密生成 一个密文服务器:接收加密信息和加密的key,用私钥对密文进行解密,得到des的key,然后再对信息用des进行解密!原文转自:https://blog.csdn.net/iamshaofa/article/details/7703

2021-11-30 17:42:46 3719

原创 【Java基础】类加载过程

要点:1、类加载机制的原理2、程序初始化的顺序3、类加载的代理模式(双亲委托机制)一、类加载机制JVM把class文件加载到内存,并对数据进行校验、准备、解析、初始化,最终形成JVM可以直接使用的Java类型的过程。‘类加载全过程1、加载将class字节码文件加载到内存中,并将这些数据转换成方法区中的运行时数据(静态变量、静态代码块、常量池等),在堆中生成一个Class类对象代表这个类(反射原理),作为方法区类数据的访问入口。类的加载原理2、链接将Java类的二进制代码合并到JVM

2021-11-27 19:37:23 107

原创 Java对象头布局

HotSpot虚拟机中,对象在内存中的布局分为三块区域:对象头、实例数据和对齐填充。对象头对象头包括两部分:Mark Word 和 类型指针。Mark WordMark Word用于存储对象自身的运行时数据,如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳等等,占用内存大小与虚拟机位长一致。类型指针类型指针指向对象的类元数据,虚拟机通过这个指针确定该对象是哪个类的实例。markOop实现HotSpot通过markOop类型实现Mark Word,

2021-11-23 15:12:25 174

原创 JAVA对象布局之对象头(Object Header)

由于Java面向对象的思想,在JVM中需要大量存储对象,存储时为了实现一些额外的功能,需要在对象中添加一些标记字段用于增强对象功能。在学习并发编程知识synchronized时,我们总是难以理解其实现原理,因为偏向锁、轻量级锁、重量级锁都涉及到对象头,所以了解java对象头是我们深入了解synchronized的前提条件,以下我们使用64位JDK示例1.对象布局的总体结构2.获取一个对象布局实例1.首先在maven项目中 引入查看对象布局的神器<dependency> <g.

2021-11-23 15:02:55 788

原创 Reactor线程模型的实现

一、Selector&Channel1.1:各种channel写这个模型需要提前了解Selector以及Channel,之前记录过FileChannel,除此之外还有以下几种Channel:ServerSocketChannel:用于监听新的TCP连接的通道,负责读取&响应,通常用于服务端的实现。SocketChannel:用于发起TCP连接,读写网络中的数据,通常用于客户端的实现。DatagramChannel:上述两个通道基于TCP传输协议,而这个通道则基于UDP,用于读写网络

2021-11-18 17:19:14 644

原创 NIO线程模型

一、基于BIO下的线程处理模式这种处理模型是基于阻塞IO进行的,上一篇讲过,阻塞IO会阻塞每一个IO操作,直到事件就绪,下面来看下阻塞IO下的服务端线程模型:图1如上图所示,该线程模型基于阻塞IO模型实现,针对每个请求都需要抽出来一个线程进行处理读入数据、业务处理数据、返回响应结果给客户端,这个过程中读、写操作均会阻塞,且跟业务处理串行执行,该模式下,并发量过大时会大量创建线程,发生的大量上下文切换,从而导致CPU资源占用过大,当连接建立后,若当前线程暂无可读数据,则线程会一直阻塞在读操作上,造成线

2021-11-18 17:06:03 286

原创 面试官再问你 HashMap 底层原理,就把这篇文章甩给他看

前言HashMap 源码和底层原理在现在面试中是必问的。因此,我们非常有必要搞清楚它的底层实现和思想,才能在面试中对答如流,跟面试官大战三百回合。文章较长,介绍了很多原理性的问题,希望对你有所帮助~目录本篇文章主要包括以下内容:HashMap 的存储结构常用变量说明,如加载因子等HashMap 的四个构造函数tableSizeFor()方法及作用put()方法详解hash()方法,以及避免哈希碰撞的原理resize()扩容机制及原理get()方法为什么HashMap链表会形成死循环,

2021-11-17 18:20:49 149

原创 HashMap为什么线程不安全

一、学习目标1、HashMap线程不安全原因:原因:JDK1.7 中,由于多线程对HashMap进行扩容,调用了HashMap#transfer(),具体原因:某个线程执行过程中,被挂起,其他线程已经完成数据迁移,等CPU资源释放后被挂起的线程重新执行之前的逻辑,数据已经被改变,造成死循环、数据丢失。JDK1.8 中,由于多线程对HashMap进行put操作,调用了HashMap#putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的,当线程A执行

2021-11-17 16:17:06 19658 4

原创 Elasticsearch 为什么能做到快速检索?— 倒排索引的秘密

原文转自:https://mp.weixin.qq.com/s/vwTrRSfgJ-7bWQUJWhfaHQ| 前言最近接触的几个项目都使用到了 Elasticsearch (以下简称 ES ) 来存储数据和对数据进行搜索分析,就对 ES 进行了一些学习。本文整理自我自己的一次技术分享。本文不会关注 ES 里面的分布式技术、相关 API 的使用,而是专注分享下 ”ES 如何快速检索“ 这个主题上面。这个也是我在学习之前对 ES 最感兴趣的部分。本文大致包括以下内容:1) 关于搜索传统关系型数

2021-11-15 12:07:06 176

原创 Spring Cloud Feign【源码篇】Feign 如何进行服务间请求调用

参考资料:Spring Cloud 官网相关版本:Spring Boot 2.1.5 、 spring cloud Greenwich.SR1spring-cloud-openfeign 2.1.1Spring Cloud Feign 默认使用 HTTP 的形式进行远程服务调用。先来看一个简单的案例,假设此时有一个服务provider 和一个服务consumer。服务provider9527提供接口/hello/{name}服务consumer9528调用.

2021-11-12 15:51:17 690

原创 手机短信备份文件sms.vmsg文件解析(Java版)

ConvertMain.javaimport java.io.File;import java.nio.ByteBuffer;import java.nio.CharBuffer;import java.nio.charset.Charset;import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class ConvertMain { public static void mai

2020-09-24 17:36:30 1636 2

原创 Volatile保持线程可见性分析

直接上代码public class Test { private static volatile boolean flag = true; public static void main(String[] args) { new Thread(() -> { while (flag) { } System.out.println("=========="); }).start(); Thread.sleep(1000); flag = false; }}

2020-09-08 13:01:00 125

原创 低延迟/吞吐量/系统容量 是指什么

低延迟:GC暂停时间,外部数据源交互时间,锁竞争吞吐量:单个时间内,系统必须完成多少个操作系统容量:在达成吞吐量和低延迟的指标的情况下,对硬件环境的约束

2020-08-30 17:08:53 739

原创 JVM常用分析工具

jstack <pid> 查看线程,如死锁、锁等待jcmd 性能分析jhat 性能分析jinfo 查看正在运营的java应用程序参数jmap -dump:format=b,file=dump.hprof <pid> 内存分析jmc 性能分析jps 查看进程jstat -gc -t <pid> ls 性能分析jvisualvm 性能分析jprofile 性能分析Eclipse MAT性能分析Plumbr 性能分析...

2020-08-30 17:06:10 267

原创 真正理解MySQL的锁

当使用select … for update …where …时,mysql进行row lock还是table lock只取决于是否能使用索引(例如主键,unique字段),能则为行锁,否则为表锁;未查到数据则无锁。而 使用’<>’,'like’等操作时,索引会失效,自然进行的是table lock。所以慎用for update。参考: https://www.cnblogs.com/wangshiwen/p/9837408.html表信息表结构mysql> desc t;.

2020-08-29 14:55:07 103

原创 真正理解MySQL的四种事务隔离级别

四大特性ACID事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability)。这四个特性简称为 ACID 特性。原子性事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做。一致性事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据

2020-08-28 15:25:40 169

原创 史上最全JVM面试题总结

一、什么情况下会发生栈内存溢出?1、栈是线程私有的,栈的生命周期和线程一样,每个方法在执行的时候就会创建一个栈帧,它包含局部变量表、操作数栈、动态链接、方法出口等信息,局部变量表又包括基本数据类型和对象的引用;2、当线程请求的栈深度超过了虚拟机允许的最大深度时,会抛出StackOverFlowError异常,方法递归调用肯可能会出现该问题;3、调整参数-xss去调整jvm栈的大小二、详解JVM内存模型?jvm将虚拟机分为5大区域,程序计数器、虚拟机栈、本地方法栈、java堆、方法区;程序计数器:

2020-08-28 12:19:39 642

原创 限流算法的原理

计数器算法在一定时间内,对处理的请求数进行计数,每次到达时间临界点则计数器清零。在一定时间间隔内,若计数器数字超限,则进行限流。该算法的问题是,在两端临界点附加可能出现两倍的流速。滑动窗口算法基于计数器算法那,把时间间隔分片。例如服务限流每秒处理100个请求,把1秒分为10个窗口。每100毫秒移动一次,内存中保留每次的请求次数。每次移动判断一下总次数是否超限。当滑动窗口的格子划分的越多,滑动窗口的滚动就越平滑,限流的统计就会越精确。滑动窗口算法可以有效规避计数器算法中时间临界点问题。但实现起

2020-08-24 19:42:47 1144

原创 java线程池,阿里为什么不允许使用Executors?

目录带着问题基础什么是线程池创建线程很“贵”吗?线程池的机制?还有哪些常见的线程池Java中的线程池Executors提供的工厂方法ThreadPoolExecutor任务队列、核心线程数、最大线程数的逻辑关系那么这三个参数推荐如何设置,有最优值吗?问题1:阿里开发规范为什么不允许Executors快速创建线程池?问题2:下面的代码输出是什么?最后带着问题1、阿里Java代码规范为什么不允许使用Executors快速创建线程池?2、下面的代码输出是什么?ThreadPoolExecutor exec

2020-08-15 19:18:16 596

原创 Spring Cloud Stream 进阶配置——使用延迟队列实现“定时关闭超时未支付订单”

延迟队列延迟队列 操作的对象是延迟消息,所谓 “延迟消息” 是指当消息被发送以后,并不想让消费者立刻消费消息,而是等待特定时间后,消费者才能拿到消息进行消费。延迟队列比较经典的使用场景有:在订单系统中,用户下单后,如果未在规定时间内(比如30分钟)支付,那么该订单会被关闭,即自动取消订单。用户希望通过手机远程控制家里的智能设备在指定的时间进行工作。这时候可以将用户指令发送到延迟队列,当指令时间到了,再将指令推送到智能设备。基于 RabbitMQ 的延迟队列使用死信队列实现延迟队列在 AMQP

2020-06-04 10:57:26 2429

原创 SpringCloud——Feign使用和原理

一、使用1、配置feign添加依赖在maven的pom中添加feign<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId></dependency>配置启用在Application启动类中添加@EnableFeignClients注解。

2020-06-03 11:38:29 711

原创 SpringCloud——Ribbon使用和原理

SpringCloud中的Ribbon开源项目,提供了客户端的负载均衡算法。这篇文章,我们来介绍下他是如何实现的。为了方便理解,我们以客户端调用的流程来介绍,其中会穿插介绍相关源代码。简单回顾下Ribbon的使用,这里强调两点:1、在启动类Application中,添加@LoadBalanced注解。@Bean@LoadBalancedRestTemplate restTemplate() { return new RestTemplate();}2、结合RestTemplate发起调用,

2020-06-03 11:38:20 212

原创 JAVA高级开发工程师面试系列——高并发

并行与并发https://www.cnblogs.com/wxd0108/p/5479442.html https://blog.csdn.net/u013945548/article/details/50988456高并发下实现高吞吐量和线程安全

2018-07-01 11:39:16 464

原创 JAVA高级开发工程师面试系列——Atomic

AtomicIntAtomicLong

2018-07-01 11:35:13 517

原创 JAVA高级开发工程师面试系列——锁

LockLock类也可以实现线程同步,而Lock获得锁需要执行lock方法,释放锁需要执行unLock方法;ReentrantLockReadWriteLockLock类有读锁和写锁,读读共享,写写互斥,读写互斥ReentrantReadWriteLock死锁独占锁,共享锁,乐观锁,悲观锁,互斥锁,排它锁,可重入锁独占锁 就是在同一时刻只能有一...

2018-07-01 11:31:13 308

原创 JAVA高级开发工程师面试系列——集合

dd

2018-07-01 11:30:32 293

原创 JAVA高级开发工程师面试系列——多线程、线程池

LockLock类也可以实现线程同步,而Lock获得锁需要执行lock方法,释放锁需要执行unLock方法;ReentrantLockReadWriteLockLock类有读锁和写锁,读读共享,写写互斥,读写互斥ReentrantReadWriteLock死锁独占锁,共享锁,乐观锁,悲观锁,互斥锁,排它锁,可重入锁独占锁 就是在同一时刻只能有一个线程获取到...

2018-07-01 11:27:40 231

原创 JAVA高级开发工程师面试系列——线程池

线程池原理ExecutorsExecutor家族Callable和Runnable区别Runnable不返回结果,不抛出检查异常Future家族

2018-07-01 11:02:06 178

原创 JAVA高级开发工程师面试系列——多线程

线程生命周期wait和sleep,yield,notify,notifyAll区别sleep:不释放锁,不让出系统资源,用yeild需要时间到或interrupt()方法任意地方使用必须捕获异常(有异常抛出) wait:释放锁,让渡系统资源需要notify()或notifyAll()唤醒只能在同步块内使用不需要捕获异常(有异常抛出)线程join线...

2018-07-01 10:58:35 179

原创 JAVA高级开发工程师面试系列——Java的数据结构

数组相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。优点:get和set的时间复杂度是O(1);缺点:add和remove的时间复杂度是O(n)链表非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表有一系列点组成。优点:add和remove的时间复杂度是O(1);缺点:get和set的时间复杂度是O(n)队列队列是一种特殊的线性...

2018-07-01 10:53:35 236

原创 JAVA高级开发工程师面试系列——JVM

JVM厂商HotspotJVM调优避免大对象和FullGC;对象有效期保证在新生代;JVM内存扩展合理分配;操作系统JVM内存模型(JMM,Java Memory Model)程序计数器:线程私有,代表了线程所执行的字节码行号指示器 JAVA虚拟机栈:每个方法在执行时,都会创建一个栈桢,用来存储这个方法的变量表,操作数栈,动态链接方法,返回值,返回地址等信息,每一个方...

2018-07-01 10:50:57 312

原创 JAVA高级开发工程师面试系列——Zookeeper

zookeeper选举机制zookeeper集群zookeeper如何进行数据同步zookeeper分布式锁zookeeper角色为什么需要Observer架构承受较大规模Client,需要增加Server,Server增加,则选举投票耗时变长,ZK集群恢复写功能的耗时变长,这就是写性能下降。可以考虑增加Observer,Observer只接收投票结...

2018-07-01 10:47:57 547

空空如也

空空如也

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

TA关注的人

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