自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Nginx配置反向代理

Nginx配置反向代理,什么是反向代理反向代理服务器决定哪台服务器提供服务。返回代理服务器不提供服务器。只是请求的转发。

2019-10-10 22:54:51 92030 6

原创 【硬核】HashMap最全面试题(附答案)

文章目录hashmap基础hashmap的nodehashmap的容量hashmap的负载因子hashmap的hash()算法HashMap里面的hash()返回值hashmap的数组+链表/树问题hashmap为什么引入链表为什么jdk1.8会引入红黑树呢hashmap为什么一开始不就使用红黑树?HashMap的底层数组取值的时候,为什么不用`取模`,而是&数组的长度为什么是2的次幂如果指定数组的长度不为 2次幂,就破坏了数组的长度是2次幂的这个规则吗?hashmap里面的源码HashMap的pu

2021-07-15 10:08:03 12705 36

原创 jdk1.7ConcurrentHashMap源码探究

出现背景1、线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。2、效率低下的HashTable容器HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下。因为当一个线程访问HashTable的同步方法时,其他线程访问HashTable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用p

2020-05-14 09:33:06 3057 1

原创 ubuntu安装|卸载docker

Ubuntu安装Docker这个网上有不少,这个正常安装就能够搞定了首先使用命令sudo apt update 更新安装包,我的已经更新过了,所以无需更新sudo apt update然后使用命令sudo apt install docker.iosudo apt install docker.io然后就可以使用sudo docker version命令看安装好的版本了sud...

2020-04-21 09:32:00 6042

原创 阿里Java面试题(附有答案)

2019阿里面试题(附有答案)

2019-11-07 09:53:49 2869

原创 FreeMarker入门指南

FreeMarker基础,FreeMarker的List,Map集合使用,FreeMarker里面的#if,#else,#assign,#list

2019-10-24 09:43:04 3974 2

原创 深入探究@Mock注解的底层原理

Mockito框架里面的@mock注解吗大公司里面测试是非常重要的,几乎占到了开发的二分之一公司,而Mockito框架是Java测试的首选,然后@Mock注解又是Mockito框架里面的重中之重,了解@Mock注解的原理对于Java的测试是非常有帮助的。

2019-10-14 09:28:38 2051

原创 ThreadLocal的源码探究

ThreadLocal源码探究,ThreadLocal原理,ThreadLocal的作用

2019-10-09 14:52:42 1733

原创 Java源码中经常看到的CountDownLatch类详解

我们在Java源码里面经常看到CountDownLatch类的存在,它的作用是什么呢,今天我们来揭开它的真面目。您请往下看CountDownLatch类的作用是什么CountDownLatch是JAVA提供在java.util.concurrent包下的一个辅助类,可以把它看成是一个计数器,其内部维护着一个count计数,只不过对这个计数器的操作都是原子操作,同时只能有一个线程去操作这个计数...

2019-09-20 09:22:42 1233 1

原创 Idea运行报错Error running ‘Application‘: Command line is too long的解决方法

新项目再Idea里面启动的时候,有的时候报错信息如下所示怎么解决呢,首先找到项目里面的idea/workspace.xml文件,然后再找到标签,标签如下所示然后再在component 标签里加一行 ,就是变成下面这样这样在启动项目,就不会报错了,؏؏☝ᖗ乛◡乛ᖘ☝؏؏...

2019-09-18 15:04:26 90010 28

转载 一文看懂怎么解决Maven依赖冲突问题

在本文中,我们将讲到如何处理Maven的依赖冲突不知道你在使用Maven时是否遇到过诸如"NoSuchMethodError"或"ClassNotFoundException"之类的问题,甚至发生这些问题的Java类你没都没有听说过。要搞清楚这里面的缘由,我们得学习Maven对依赖冲突的处理机制。Maven采用“最近获胜策略(nearest wins strategy)”的方式处理依赖冲突,即...

2019-08-20 17:33:11 4955 2

原创 分布式唯一ID生成系列(5)——Twitter的雪法算法Snowflake适合做分布式ID吗

介绍Snowflake算法SnowFlake算法是国际大公司Twitter的采用的一种生成分布式自增id的策略,这个算法产生的分布式id是足够我们我们中小公司在日常里面的使用了。我也是比较推荐这一种算法产生的分布式id的。算法snowflake的生成的分布式id结构组成部分算法snowflake生成id的结果是一个64bit大小的整数,它的结构如下图,这里我么来讲一下这个结构:首先因为w...

2019-08-14 09:50:41 1569

原创 分布式唯一ID生成系列(4)——Redis集群实现的分布式ID适合做分布式ID吗

首先是项目地址:https://github.com/maqiankun/distributed-id-redis-generator关于Redis集群生成分布式ID,这里要先了解redis使用lua脚本的时候的EVAL,EVALSHA命令:https://www.runoob.com/redis/scripting-eval.htmlhttps://www.runoob.com/redi...

2019-08-08 09:47:13 1046

原创 分布式唯一ID生成系列(3)——数据库自增ID机制适合做分布式ID吗

数据库自增ID机制原理介绍在分布式里面,数据库的自增ID机制的主要原理是:数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace数据库自增ID和mysql数据库的replace_into()函数实现的。这里的replace into跟insert功能类似,不同点在于:replace into首先尝试插入数据列表中,如果发现表中已经有此行数据(根据主键或唯一...

2019-08-07 10:07:42 1032

原创 分布式唯一ID生成系列(2)——UUID适合做分布式ID吗

UUID的生成策略:UUID的方式能生成一串唯一随机32位长度数据,它是无序的一串数据,按照开放软件基金会(OSF)制定的标准计算,UUID的生成用到了以太网卡地址、纳秒级时间、芯片ID码和许多可能的数字。UUID的底层是由一组32位数的16进制数字构成,是故 UUID 理论上的总数为 ,约等于 ,也就是说若每纳秒产生1百万个 UUID,要花100亿年才会将所有 UUID 用完(100亿年啊,地...

2019-08-06 09:10:28 1096

原创 分布式唯一ID生成系列(1)——为什么需要分布式ID以及分布式ID的业务需求

为什么需要分布式id生成系统在复杂分布式系统中,往往需要对大量的数据和消息进行唯一标识。如在美团点评的金融、支付、餐饮、酒店、猫眼电影等产品的系统中,数据日渐增长,对数据分库分表后需要有一个唯一ID来标识一条数据或消息,数据库的自增ID显然不能满足需求;特别一点的如订单、骑手、优惠券也都需要有唯一ID做标识。此时一个能够生成全局唯一ID的系统是非常必要的。概括下来,那业务系统对ID号的要求有哪些...

2019-08-05 16:01:34 2827

原创 大白话讲解分布式里面的Cap原则

什么叫做capCap分别指可用性,分区容错性,一致性分区容错性如下图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。系统设计的时候,必须考虑到这种情况。一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。所以在cap原则里面,分区容错性是必须要有的一致性一致性的意思是,写操作之后的读操作,必须返回该修改后的值。举例来说,某条记录...

2019-08-02 09:37:39 5053 3

原创 Debug方式讲解Rabbitmq的自动ACK和手动ACK

介绍Rabbitmq的手动ACK和自动ACK当消息一旦被消费者接收,队列中的消息就会被删除。那么问题来了:RabbitMQ怎么知道消息被接收了呢?这就要通过消息确认机制(Acknowlege)来实现了。当消费者获取消息后,会向RabbitMQ发送回执ACK,告知消息已经被接收。不过这种回执ACK分两种情况:自动ACK:消息一旦被接收,消费者自动发送ACK手动ACK:消息接收后,不会发送A...

2019-08-01 09:45:44 20438 6

原创 Java里面的四种引用:强引用,软引用,弱引用,虚引用

在垃圾回收的时候,被释放的对象要考虑什么样的对象内存要被GC回收掉,那么怎么判断哪些对象要被回收掉呢,在java里面定义了四种引用对象,不同的引用对象在被GC扫描的时候,会有不同的处理方式,这里我们来看一下强引用强引用介绍强引用是用来描述必须存在和引用的对象,比如Object a=new Object(),只要强引用还存在,被引用的对象就永远不会被回收。强引用怎么被垃圾回收方法里面的局部...

2019-07-31 09:06:22 1861 7

原创 Mysql索引底层的Bmore树设置非叶子节点数据小于4KB来减少IO磁盘读取次数

原因如下所示因为数据库里面的索引就是使用的bmore树,所以我们使用sql语句来讲解bmore树的产生:比如有下面的两个常用的需求:根据某个值查找数据,比如select * from user where id=1234;根据区间值来查找某些数据,比如select * from user where id > 1234 and id < 2345。为了让二叉查找树支持按照区...

2019-07-30 09:08:03 1829

原创 linux查看日志的奇淫技巧

对于日志很大,打开的时候造成服务器压力的日志文件怎么处理首先介绍命令,下面的awk ‘END{print NR}’ hello.txt表示查看hello.txt文件里面总共有多少行,下面的sed -n ‘1,3p’ hello.txt表示把hello.txt文件里面的第一行到第三行里面的内容给输出来awk 'END{print NR}' hello.txtsed -n '1,3p' hell...

2019-07-26 09:51:32 680 2

原创 算法题之动态规划-01背包问题

文字介绍解决背包问题假设山洞里共有a,b,c,d ,e这5件宝物(不是5种宝物),它们的重量分别是2,2,6,5,4,它们的价值分别是6,3,5,4,6,现在给你个承重为10的背包, 怎么装背包,可以才能带走最多的财富。此时只要理解了状态转换方程f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] },就知道这道算法的答案了,这个状态转换方...

2019-07-24 18:40:28 5151 9

原创 Java面试之内存屏障

为什么要有内存屏障这个是为了解决因为cpu,高速缓存,主内存出现的时候,导致的可见性和重序性问题,什么问题呢,看下面的代码我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。CPU要与内存进行交互,如读取运算数据、存储运算结果等。由于内存和CPU的计算速度有几个数量级的差距,为了提高CPU的利用率,现代处理器结构都加入了一层读写速度尽可能接近CP...

2019-07-24 09:40:52 5996

原创 cpu,高速缓冲区,主内存导致可见性和重排序问题

cpu,高速缓冲区,主内存之间的关系我们都知道计算机运算任务需要CPU和内存相互配合共同完成,其中CPU负责逻辑计算,内存负责数据存储。CPU要与内存进行交互,如读取运算数据、存储运算结果等。由于内存和CPU的计算速度有几个数量级的差距,为了提高CPU的利用率,现代处理器结构都加入了一层读写速度尽可能接近CPU运算速度的高速缓存来作为内存与CPU之间的缓冲:将运算需要使用的数据复制到缓存中,让C...

2019-07-23 16:21:03 729 1

原创 IT世界里面的牛逼网站

在不停的学习中,碰到了不少牛人网站,在这里记一下以便以后寻找阿里中间件美团点评团队奇虎360团队阮一峰的网络日志月光

2019-07-23 15:20:18 1108 2

原创 模拟并解决缓存穿透

什么叫做缓存穿透缓存穿透只会发生在高并发的时候,就是当有10000个并发进行查询数据的时候,我们一般都会先去redis里面查询进行数据,但是如果redis里面没有这个数据的时候,那么这10000个并发里面就会有很大一部分并发会一下子都去mysql数据库里面进行查询了解决缓存穿透首先我模拟一下缓存穿透比如下面的代码Pom.xml代码<?xml version="1.0" encod...

2019-07-23 09:47:34 721 2

原创 多线程里面的原子性,可见性,有序性

原子性原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。

2019-07-22 09:33:52 3699 1

原创 jvm内存泄漏

内存泄漏和内存溢出的关系内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。从定义上可以看出内存泄露是内存溢出的一种诱因,但是不是唯一因素。可以使用Runtime.ge...

2019-07-19 10:02:39 4257

原创 事务的ACID

为什么叫做acid呢因为下面这几个单词1)原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 2)一致性(Consistency)一个事务中,事务前后数据的完整性必须保持一致。3)隔离性(Isolation)多个事务,事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。...

2019-07-19 09:38:22 1955

原创 Jvm内存溢出

堆内存溢出(outOfMemoryError:java heap space)在jvm规范中,堆中的内存是用来生成对象实例和数组的。如果细分,堆内存还可以分为年轻代和年老代,年轻代包括一个eden区和两个survivor区。当生成新对象时,内存的申请过程如下:a、jvm先尝试在eden区分配新建对象所需的内存;b、如果内存大小足够,申请结束,否则下一步;c、jvm启动youngGC,试图将...

2019-07-19 09:37:16 485

原创 大白话讲解Mysql之悲观锁

悲观锁悲观锁的原理是什么呢,就是给c事务里面的某一个sql语句添加一把锁,当a线程执行这个有锁的sql语句的时候,b线程就只能执行到c事务里面这个有锁的sql语句前面的一些sql语句,然后等到a线程执行完这个有锁的sql语句的事务的时候,b线程才能执行c事务里面有锁的sql语句实例讲解悲观锁

2019-07-18 10:13:52 12581 7

原创 大白话讲解Mysql之乐观锁

乐观锁什么是乐观锁什么是乐观锁呢,就是给数据库的数据表添加一个字段version,在更新数据库记录是将version加1,从而在修改数据时通过检查版本号是否改变判断出当前更新基于的查询是否已经是过时的版本。不是太好理解,这里我么就借助实例来讲解乐观锁(下面实例讲解的过程中,商品的数量就可以直接相当于字段version了,所以就没有在加version字段了)。这里就使用乐观锁来解决购买商品时候...

2019-07-18 09:57:31 10367 6

原创 事务里面的脏读、不可重复读、虚读/幻读

脏读举例演示脏读脏读就是B事务读取到了A事务尚未提交的数据 ,什么意思呢,往下看首先执行下面的sql语句drop table acount;create table acount(id int,name varchar(225),money int);insert into acount values(1,'tom',2500);insert into acount val...

2019-07-17 09:18:00 4772 1

原创 Mockito框架抛出NullPointerException

首先看一下Mockito框架是怎么抛出NullPointerException比如下面的代码

2019-07-16 18:53:59 9560 3

原创 应用层协议详解

使用http协议讲解应用层协议首先查看linux里面有没有telnet命令,如果没有的话,就使用下面的命令进行安装telnet命令yum install xinetd telnet telnet-server -y然后执行下面的命令,telnet命令本身就是一个应用层协议,它的作用是在两台主机间,建立一个连接,也就是打开两台主机间文本传输的一个通道。"telnet google.com ...

2019-07-16 09:39:33 2600

原创 网络通信协议

网络通信协议什么是网络通信协议Tcp/ip协议可不是单单指tcp协议和ip协议Tcp/ip协议里面的网络模型层Tcp/ip协议里面的网络模型层如下所示应用层协议举例讲解应用层协议传输层协议网络层协议链路层协议通过一次数据的传输来讲解Tcp/ip协议里面的网络模型层什么是网络通信协议通过计算机网络可以使多台计算机实现连接,位于同一个网络中的计算机在进行连接和通信时需要遵守一定的规则,这就好比在道...

2019-07-16 09:34:32 1240

原创 java类的加载过程

类的加载过程目录什么是类的加载过程类加载的过程讲解第一个部分:加载阶段加载时类加载过程的第一个阶段,在加载阶段,虚拟机需要完成以下三件事情,就是下面的三件在类的加载过程中,相对于类加载过程里面的的连接和初始化阶段而言,加载阶段是可控性最强的阶段,因为开发人员既可以使用系统提供的类加载器来完成加载,也可以自定义自己的类加载器来完成加载。第二个部分:连接阶段连接阶段之验证小阶段验证的目的验证做的具体内...

2019-07-16 09:10:56 6447 4

原创 ConstantValue属性

ConstantValue属性在类加载过程的准备阶段做的事情是什么在编译时Javac将会为被static和final修改的常量生成ConstantValue属性(此时ConstantValue属性的值是多少,暂时不知道,),在类加载的准备阶段虚拟机便会根据ConstantValue为常量设置相应的值(这个值是什么意思呢,比如我们在程序中定义final static int a = 100,那么这...

2019-07-16 09:05:04 3723

原创 Nginx实现负载均衡

在看这个知识点之前,先学会nginx的反向代理先看nginx的反向代理,就看这个链接:https://blog.csdn.net/weixin_43689480/article/details/95860813nginx实现负载均衡的过程想要的结果就是:给 www.sina.com 添加多个tomcat服务器首先安装两个tomcat服务器,都放到nginx服务器里面,两个端口分别是80...

2019-07-15 18:54:11 1261

原创 EditPlus操作linux里面的文件

有的时候我们不是很了解vi命令,不好处理linux里面的文件,此时告诉大家一个好技巧,就是通过EditPlus来链接你的linux服务器,来处理linux里面的文件,十分好用哦。连接过程如下首先选中下面的FTP settings然后就是点击add添加你的linux服务器然后要注意点击下面的Advanced Options选项进行配置然后在注意点击下面的OK然后我们就可以愉快的...

2019-07-14 11:33:40 3466

空空如也

空空如也

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

TA关注的人

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