自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(73)
  • 资源 (1)
  • 收藏
  • 关注

原创 YCSB基准性能测试之HBase

官方工具下载链接:https://github.com/brianfrankcooper/YCSB/releases官方使用文档:https://github.com/brianfrankcooper/YCSB/tree/master/hbase2YCSB workload策略workloadaread50%,update50%重更新workloadbread95%,update5%读多写少workloadcread100%只读workloaddre

2022-01-05 17:02:47 2114

原创 git提交报configuration specifies to merge with the ref ‘’refs/heads/master‘

问题建立新的分支,当咱们执行git pull,出现以下错误gitconfiguration specifies to merge with the ref ‘’refs/heads/master’解决1、切换到主分支(或者被依赖的分支,也就是你从哪一个分支上拉取新的分支)git checkout master2、执行命令初始化仓库分支git initgit pull3、切换到新的分支git checkout main4、执行提示的命令git branch --unset-u

2021-08-18 10:47:38 3748

原创 NC3 链表中环的入口结点

/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { if(pHead==null||pHead.next==null){ .

2021-08-07 22:56:04 504

原创 LeetCode 102. 二叉树的层序遍历

思路:首先新建一个前序遍历函数,然后,其中参数包括结点、List和深度,如果深度大于list中list的数量,则新加入一个list再取list中的第deep-1个列表 加入root.val的值class Solution { List<List<Integer>> list=new ArrayList<>(); public List<List<Integer>> levelOrder(TreeNode root) { .

2021-08-04 20:23:54 386

原创 LeetCode42. 接雨水

解题思路从数组下标0开始进行遍历,计算每一个单元能够容纳的水量是多少,然后进行求和。(不知道能不能实现或者实现很困难)每个单元能够存储的水量取决于左右两侧"墙"的最大值中的最小值。尝试先遍历出每个单元左侧"墙"和右侧"墙"的最大值,然后进行循环遍历,利用公式:​ water=min(max(leftMax,rightMax)-x)使用双指针,计算左指针左侧最大值leftMax和右指针右侧最大值rightMax,然后利用上面公式计算。class Solution { .

2021-07-30 23:10:30 586

原创 NC4 判断链表中是否有环

使用快慢指针,如果存在闭环的话,快慢指针一定会相遇。public class Solution { public boolean hasCycle(ListNode head) { if(head==null) return false; ListNode slow=head; ListNode fast=head; while(fast!=null&&fast.next!=null){ sl.

2021-07-30 22:55:06 579

原创 i++不是原子性操作解决方法

使用i++,内存中主要流程:把i的数值,从内存读入寄存器。(寄存器在CPU上)寄存器将数值+1。将寄存器的值写回内存。测试代码:public class IPPTest { private static int a=0; public static void main(String[] args) { for (int i = 0; i < 10000; i++) { new Thread(()->{

2021-06-27 14:38:54 903

原创 偏向锁、轻量级锁、重量级锁

1. 偏向锁1.1 引入的目的​ 为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径。因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令。1.2 执行流程获取锁:检测Mark Word是否为可偏向状态,即是否为偏向锁1,锁标识位为01;若为可偏向状态,则测试线程ID是否为当前线程ID,如果是,则执行步骤(5),否则执行步骤(3);如果线程ID不为当前线程ID,则通过CAS操作竞争锁,竞争成功,则将Mark Word的线程

2021-06-27 12:38:51 811

原创 剖析 Java并发关键字synchronized以及优化

synchronized的作用范围:synchronized修饰成员变量和非静态方法,锁的是对象的实例。synchronized void method() {//业务代码}synchronized修饰静态方法时,锁住的是Class实例,因为static是JVM层面的方法,属于Class而不属于对象。synchronized void staic method() {//业务代码}synchronized修饰一个代码块时,锁住的是所有代码块中的对象。synchronize

2021-06-25 23:02:35 838

转载 CPU密集型、IO密集型

CPU密集型(CPU-bound)CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。在多重程序系统中,大部份时间用来做计算、逻辑判断等CPU动作的程序称之CPU bound。例如一个计算圆周率至小数点一千位以下的程序,在执行的过程当中绝大部份时间用在三角函数和开根号的计算,便是属于CPU bound

2021-06-22 23:40:40 1316

原创 线程的生命周期

调用new方法创建一个线程(New)调用start启动一个线程(Runnable)处于就绪状态的线程等待获取CPU资源,获取CPU资源之后线程会执行run方法进入运行状态(Running)正在运行的线程调用yield方法或者失去CPU资源就会再次进入就绪状态。正在运行的线程执行sleep方法、I/O阻塞、等待同步锁等都会挂起线程进入阻塞状态,进入Blocked池(Blocked)阻塞状态由于sleep时间到、I/O方法返回、获得同步锁等会再次进入就绪状态。正在运行的线程调用run方法或者ca..

2021-06-22 23:34:01 1227

原创 线程池的拒绝策略

转载自链接static是Java中的一个关键字,我们不能声明普通外层类或者包为静态的。static用于下面四种情况。1.静态变量:我们可以将类级别的变量声明为static。静态变量是属于类的,而不是属于类创建的对象或实例。因为静态变量被类的所有实例共用,所以非线程安全的。通常静态变量还和关键字final一起用,作为所有对象共用的资源或常量。如果静态变量不是私有的,那么可以通过ClassName.variableName来访问它....

2021-06-18 22:24:08 1572

原创 线程池的核心参数以及线程池的工作流程

序号 参数 说明 1 corePoolSize 核心线程数量 2 maximumPoolSize 最大线程数量 3 keepAliveTime 当前线程数量超过最大线程数量,空闲线程最大存活时间 4 unit keepAliveTime的时间单位 5 workQueue 任务队列 6 threadFactory 线程工厂,用于创建线程 7 handler 由于线程任务过多或者其他原因导

2021-06-18 21:23:51 1657

原创 Java单例模式

单例模式的设计是保证了一个类在整个系统中同一时刻只有一个实例存在,主要是被用于一个全局类的对象在多个地方被使用并且对象的状态是全局变化的场景下。单例模式为系统资源的优化提供了一个很好的思路,频繁创建和销毁对象都会增加系统的资源消耗,单例模式很好的节约了资源。1️⃣不安全类public class UnsafeLazyInitialization { private static UnsafeLazyInitialization instance; //加上Synchronized来保证

2021-06-16 22:45:05 2033 1

原创 常见垃圾回收器

**CMS收集器:**实现了用户线程和垃圾回收线程同时工作#mermaid-svg-vZ8WqMZrGGMxVtSA .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-vZ8WqMZrGGMxVtSA .label text{fill:#333}#mermaid-svg-vZ8WqMZrGGMxVtSA .no.

2021-06-09 14:48:18 1273

原创 JVM类加载过程

**加载:**将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区中的运行时数据结构,在堆中生成一个代表这个类的java.lang.Class对象,作为方法区类数据的访问入,这个过程需要类加载器参与。连接: 将java类的二进制代码合并到JVM的运行状态之中验证:确保加载的类信息符合JVM规范,没有安全方面的问题准备:在方法区为类变量分配内存空间并设置类中变量的初始值**注意:**如果是final修饰的变量,会在准备阶段就将变量初始化为value值;如果没有fin...

2021-06-07 21:52:57 1276

原创 Java对象的创建过程

加载检查:首先虚拟机在遇到一条new指令的时候,会去检查这个指令的参数在常量池中是否可以定位到这个类的符号引用,并且检查该类是否被加载、解析、初始化过,如果没有就执行类的加载过程。**分配内存:**加载检查完就会为新生对象分配内存。分配内存的方式有两种:1️⃣指针碰撞 2️⃣空闲列表(选择哪一种内存分配方式取决于堆内存是否完整,而堆内存是否完整又取决于用了哪一种GC算法)指针碰撞的分配方式适用于内存规整的情况下,即GC算法采用了标记-清除-压缩算法,或者复制算法,因为在内存规整的情况下,已用内存...

2021-06-07 18:18:19 1449 2

原创 JVM分为哪几部分?

JDK1.8之前: JDK1.8: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CptavYim-1623059396709)(C:\Users\Venture\Desktop\Java\笔记文档\2022秋招面试题准备.asset

2021-06-07 17:50:31 2948 2

原创 JMM内存模型

说到底JMM其实是定义了线程和主存之间的关系。每个线程都有一个本地内存,存储了主存中共享变量、资源的副本。JMM控制了多个线程之间的通讯。通讯同步的约定:线程解锁前,必须把共享变量立刻刷回主存。线程加锁前,必须读取主存中的最新值到工作内存中!加锁和解锁是同一把锁JMM作为一个语言级的内存模型,在不同的编译器和处理器上,通过禁止特定类型的编译器和处理器重排序,提供一致的内存可见性保证。对于编译器重排序:JMM会禁止特定类型的编译器重排序对于处理器重排序:JMM会要求JVM在生成指令序列的时.

2021-06-05 15:29:01 1363

原创 LeetCode538. 把二叉搜索树转换为累加树

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) {..

2021-06-02 22:13:09 1328

原创 LeetCode230.二叉搜索树中第K小的元素

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { .

2021-06-02 22:11:25 1256

原创 LeetCode654.最大二叉树

/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) {..

2021-06-02 16:14:58 1264

原创 LeetCode116. 填充每个节点的下一个右侧节点指针

/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node next; public Node() {} public Node(int _val) { val = _val; } public Node(int _val, Node _left, Node _.

2021-05-31 21:10:26 1347

原创 LeetCode226. 翻转二叉树

翻转一棵二叉树。示例:输入: 4/ 2 7/ \ / 1 3 6 9输出: 4/ 7 2/ \ / 9 6 3 1写树相关的算法,简单说就是,先搞清楚当前 root 节点该做什么,然后根据函数定义递归调用子节点,递归调用会让孩子节点做相同的事情。我们发现只要把二叉树上的每一个节点的左右子节点进行交换,最后的结果就是完全翻转之后的二叉树/** * Definition for a binary tree node. *

2021-05-31 20:35:12 1360

原创 HashMap在并发情况下出现死循环的问题?

HashMap的数据结构:​ HashMap是用一个指针数组(假设为table[])来做分散所有的key,当一个key被加入时,会通过Hash算法通过key算出这个数组的下标i,然后就把这个<key, value>插到table[i]中,如果有两个不同的key被算在了同一个i,那么就叫冲突,又叫碰撞,这样会在table[i]上形成一个链表。我们知道,如果table[]的尺寸很小,比如只有2个,如果要放进10个keys的话,那么碰撞非常频繁,于是一个O(1)的查找算法,就变成了链表遍历,性能

2021-05-28 15:44:52 1453

原创 说说你对HashMap的理解?

​ HashMap是一种存取高效但是不保证有序的常用容器。它的数据结构为“数组+链表”,这是解决哈希冲突的产物(链地址法)。它实现了Map接口,采用KEY-VALUE键值对的形式存储数据,并且实现了浅拷贝和序列化。​ HashMap 的默认初始大小为16,初始化大小必须为2的幂,最大大小为2的30次方。数组中存储的链表节点为Entry数组,在jdk1.8源码中将Entry改为了Node,它们都实现了Map下的Entry接口。HashMap 的阈值默认为“容量*0.75f”,当存储节点数量超过该值,则对m

2021-05-28 11:48:07 1741

原创 LeetCode 92. 反转链表 II

class Solution { public ListNode reverseBetween(ListNode head, int left, int right) { // 设置 dummyNode 是这一类问题的一般做法 ListNode dummyNode = new ListNode(-1); dummyNode.next = head; ListNode pre = dummyNode; for (int i

2021-05-27 10:17:45 1324

原创 HashMap源码分析hash函数(扰动函数)

JDK1.7的hash()方法(扰动函数):final int hash(Object k) { int h = hashSeed; if (0 != h && k instanceof String) { return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); // This function e

2021-05-25 21:42:49 2015 1

原创 String、StringBuffer、StringBuilder的区别?

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {} public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence{}public final class StringBuil.

2021-05-23 21:56:30 1298

原创 #{}和${}的区别是什么?(Mybatis怎么防止SQL注入?)

属于静态文本替换,比如{}属于静态文本替换,比如属于静态文本替换,比如{driver}会被替换为com.mysql.jdbc.driver#{}是SQL的占位符,Mybatis会将SQL中的#{}替换为?,在 sql 执⾏前会使⽤PreparedStatement 的参数设置⽅法,按序给 sql 的?号占位符设置参数值。因此,#{}与${}相比,#{}可以很大程度的防止sql注入,因为对sql做了预编译处理,因此在使用中一般使用#{}方式。...

2021-05-23 21:51:42 1448

原创 Spring MVC中的控制器是不是单例模式?如果是,如何保证线程安全?

​ 控制器是单例模式。单例模式下会出现线程安全问题。​ Spring中保证线程安全的方法:将scope设置成非singleton。但是这样会有一些问题,当并发很大的时候如果每次都生成一个bean的话就会有很多实例。最好的方式是将controller控制器设置成无状态...

2021-05-22 22:39:00 3961

原创 Spring如何处理事务

​ Spring当中支持编程式事务和声明式事务**编程式事务:**通过Transaction Template手动管理事务,硬编码 ,实际应用中很少使用。声明式事务(基于XML和注解): 推荐使用(代码侵入性最小),实际是通过AOP实现。优点:不需要在业务代码中添加事务管理的代码,只需要在配置文件中做相应的事务规则就行。缺点:声明式事务只能针对方法级别,无法控制代码级别的事务管理。Spring中事务传播级别:public enum Propagation { REQUIRED(T

2021-05-22 22:25:24 1517

原创 什么是Spring?谈谈你对IOC和AOP的理解

​ Spring是一个企业级Java应用框架,它的作用主要是简化软件的开发流程以及配置过程,简化项目部署环境。​ Spring的优点:​ 1、Spring的低侵入式设计,对业务代码的污染非常低。​ 2、Spring的DI机制将对象之间的关系交由框架处理,减少组件之间的耦合。​ 3、Spring提供了AOP技术,支持将一些通用的功能进行集中式管理,从而提供更好的复用。​ 4、Spring对于主流框架提供了非常好的支持。IOC:将创建对象的控制权交给Spring来进行管理。简单的来说就是应

2021-05-22 20:43:15 1921

原创 Spring容器的启动流程是怎么样的?

使用AnnotationConfigApplicationContext跟踪启动流程:public AnnotationConfigApplicationContext(Class<?>... componentClasses) { this();//初始化reader()和scanner() register(componentClasses);//使用scanner组件来扫描basePackage包下的所有对象,将配置类的BeanDefinition注册到容器中 refresh

2021-05-22 20:41:28 1406

原创 Spring框架中Bean的创建过程是怎样的?

首先,简单来说,Spring框架的Bean经过四个阶段:实例化–>属性赋值–>初始化–>销毁​ 具体来说,Spring经过了以下几个步骤:​ 1.实例化:new xxx();两个时机:1、当客户端向容器申请一个bean时;2:当容器在初始化一个bean时发现还需要依赖另一个bean。BeanDefinition对象保存。​ 2.属性对象赋值(依赖注入):Spring通过BeanDefinition找到对象依赖的其他对象,并将这些对象赋予当前对象。​ 3.处理Aware接口:S

2021-05-22 20:38:59 1711

原创 Spring框架中的Bean是线程安全的吗?如果线程不安全,要如何处理?

Spring容器本身没有提供Bean的线程安全策略,因此,也可以说Spring容器中的bean不是线程安全的。​ 如何处理线程安全问题,分情况讨论:​ Spring的作用域(scope):singleton:单例,默认作用域。prototype:原型,每次创建一个新对象。request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。session:会话,同一个会话共享一个实例,不同会话使用不用的实例。global-sessi

2021-05-22 20:37:26 7976 4

原创 Spring如何处理循环依赖问题?

Spring使用了三级缓存来解决循环依赖的问题。三级缓存:Spring在启动的过程中,使用到了三个map,称作三级缓存。public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements SingletonBeanRegistry { /** Maximum number of suppressed exceptions to preserve. */ private static final int

2021-05-22 18:54:30 1243

转载 Java深拷贝和浅拷贝

Java深拷贝和浅拷贝浅拷贝浅拷贝介绍浅拷贝特点深拷贝深拷贝介绍深拷贝特点浅拷贝浅拷贝介绍浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。浅拷贝特点(1) 对于基本数据类型的成员对象,因为基础数据类型是值传递的,所以

2021-03-23 11:31:13 1230

原创 为什么我们调⽤ start() ⽅法时会执⾏ run() ⽅法,为什么我 们不能直接调⽤ run() ⽅法?

new ⼀个 Thread,线程进⼊了新建状态。调⽤ start() ⽅法,会启动⼀个线程并使线程进⼊了就绪状态,当分配到时间⽚后就可以开始运⾏了。 start() 会执⾏线程的相应准备⼯作,然后⾃动执⾏ run() ⽅法的内容,这是真正的多线程⼯作。 但是,直接执⾏ run() ⽅法,会把 run()⽅法当成⼀个 main 线程下的普通⽅法去执⾏,并不会在某个线程中执⾏它,所以这并不是多线程⼯作。总结: 调⽤ start() ⽅法⽅可启动线程并使线程进⼊就绪状态,直接执⾏ run() ⽅法的话不会以多

2021-03-16 21:37:25 1487 1

原创 Java面试文章整理

1、可见性(Visibility)可见性是指,当一个线程修改了某一个全局共享变量的数值,其他线程是否能够知道这个修改。显然,在串行程序来说可见性的问题是不存在的。因为你在任何一个地方操作修改了某个变量,那么在后续的程序里面,读取这个变量的数值,一定是修改后的数值。但是,这个问题在并行程序里面就不见得了。在并行程序里面,如果一个线程修改了某一个全局变量,那么其他线程未必可以马上知道这个变动。下面的图1展示了可见性问题的一种。如果在CPU1和CPU2上...

2021-03-13 14:13:47 1263

秒杀系统B站编程不良人

`如果你的项目流量非常小,完全不用担心有并发的购买请求,那么做这样一个系统意义不大。`但如果你的系统要像12306那样,接受高并发访问和下单的考验,那么你就需要一套完整的`流程保护措施`,来保证你系统在用户流量高峰期不会被搞挂了。 - 严格防止超卖:库存100件你卖了120件,等着辞职吧 - 防止黑产:防止不怀好意的人群通过各种技术手段把你本该下发给群众的利益全收入了囊中。 - 保证用户体验:高并发下,别网页打不开了,支付不成功了,购物车进不去了,地址改不了了。这个问题非常之大,涉及到各种技术,也不是一下子就能讲完的,甚至根本就没法讲完。

2021-05-27

空空如也

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

TA关注的人

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