自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(192)
  • 资源 (2)
  • 收藏
  • 关注

原创 thread start()方法源码解析

无论用哪种方式实现多线程,最终究其根源都是在调用Thread类的start()方法。而此时就有一个疑问了,若要实现多线程需要覆写其run()方法,而为什么要使用start()启动线程而不直接调用run()方法?1.首先来看一下start()方法的源码,看看这个方法究竟在干什么事情。 /** * Causes this thread to begin execution; the Java Virtual Machine * calls the <code>run

2021-07-15 15:53:57 1053

转载 Springboot中使用策略模式+工厂模式

策略模式和工厂模式相信大家都比较熟悉,但是大家有没有在springboot中实现策略和工厂模式?  具体策略模式和工厂模式的UML我就不给出来了,使用这个这两个模式主要是防止程序中出现大量的IF ELSE IF ELSE....。接下来咱们直接实现,项目结构图:工厂类FactoryStrategy负责创建策略的工厂,代码比较简单,比较关键的一点是AutoWired一个Map<String, Strategy> 这个会在初始化的时候将所有的Strategy自动加载到Map中,是不是很方

2021-06-23 16:29:41 523

原创 java8中List根据某一字段去重

实体类:package test;public class User { private String userid; private String username; private String age; private String address; public User(String userid, String username, String age, String address) { super();

2021-06-08 19:00:41 1077

原创 Java之Lists.Partition项目中遇到的坑

项目中使用Lists.Partition批量处理数据,但是最近内存一直OutOffMemory,GC无法回收。后来我们对使用过的集合手动clear,没有测试直接就上线了。尴尬的是内存回收了,但是跑出来的数据出问题了。最后自己单元测试发现是List<List<TreasureIntegrationVo>> resultPartition = Lists.partition(l...

2020-04-08 11:53:45 5812

原创 eclipse中安装lombok.jar

lombok官网:https://projectlombok.org/jar包下载路径:https://projectlombok.org/downloadlombok features:https://projectlombok.org/features/all方式一:1、下载lombok.jar包2、将lombok.jar包复制到eclipse.ini所在文件目录3、打开e...

2019-08-13 11:16:10 3845

原创 java内存溢出与解决方法

1、内存泄漏memoryleak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。2、内存溢出outofmemory:指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。3、二者的...

2019-07-23 11:18:54 668

原创 分布式锁的三种实现方式

一、为什么要使用分布式锁为了保证一个方法或属性在高并发情况下同一时间只能被同一个线程执行,在传统单机部署的情况下,可以使用Java并发处理相关的API(如ReentrantLock或Synchronized)进行互斥控制。但是,随着业务发展的需要,原单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的Jav...

2019-07-15 23:13:42 566 1

转载 CAS机制讲解

我们先看一段代码:启动两个线程,每个线程中让静态变量count循环累加100次。因为这段代码是非线程安全的,所以最终的自增结果很可能会小于200。我们再加上synchronized同步锁,再来看一下。加了同步锁之后,count自增变成了原子性操作,所以最终输出一定是count=200,代码实现了线程安全。虽然synchronized确保了线程安全,但是在某些情况下,这并不是一个...

2019-07-15 21:53:34 1414

转载 了解Redis缓存穿透、雪崩和击穿

缓存穿透缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。解决方案有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一...

2019-07-11 21:38:46 219

原创 volatile讲解

一、Java 内存模型中的可见性、原子性和有序性可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。也就是一个线程修改的结果,另一个线程马上就能看到。比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。但是这里需要注意一个问题,volatile只能让被...

2019-07-06 17:42:29 219

原创 SimpleDateFormat线程不安全

想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调试的问题,因为 DateFormat 和 SimpleDateFormat 类不都是线程安全的,在多线程环境下调用 format() 和 parse() 方法会出现问题。下面我们通过一个具体的场景来一...

2019-07-06 14:04:11 443

原创 ThreadLocal讲解

最近面试会被经常问到ThreadLocal的作用和原理,所以这里有必要学习一下。什么是ThreadLocalThreadLoal 被称为线程局部变量,即该变量运行在线程中时,每个线程都独立拥有它而不和其他线程中的这个值相冲突,其目的就使这个变量只属于当前线程,和其他线程无关。ThreadLoal 解决的是变量在不同线程间的隔离性,也就是说不同线程拥有自己的值。ThreadLoca...

2019-07-05 22:19:37 532

原创 静态代码块,构造代码块和构造函数的执行顺序

静态代码块:最早执行,类被载入内存时执行,只执行一次。没有名字、参数和返回值,有关键字static。构造代码块:执行时间比静态代码块晚,比构造函数早,和构造函数一样,只在对象初始化的时候运行。没有名字、参数和返回值。构造函数:执行时间比构造代码块时间晚,也是在对象初始化的时候运行。没有返回值,构造函数名称和类名一致。注意:静态代码块在类加载的时候就执行,所以的它优先级高于main()方法。...

2019-07-03 21:30:16 4351

原创 String是值传递还是引用传递

今天上班时,同事发现了一个比较有意思的问题。他把一个String类型的参数传入方法,并在方法内改变了引用的值。 然后他在方法外使用这个值,发现这个String还是之前的值,并没有改变。这里要向大家介绍一下,大家都知道java在传参时分为值 值传递和引用传递。参数为基本类型时是值传递, 参数为封装类型时是引用传递。例如:基本类型参数public class Test { ...

2019-07-02 20:49:24 754 1

转载 Redis与数据库一致性问题分析

缓存已经在项目中被广泛使用,在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存。又或者是先删除缓存,再更新数据库,其实大家存在很大的争议。所以参考了网上一些资料对这块进行讲解。先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写...

2019-07-01 20:35:58 31099 7

原创 单链表反转(逆序)

面试被问到单链表反转,一脸懵逼,回来赶紧补1、单链表的结点结构:data域:存储数据元素信息的域称为数据域; next域:存储直接后继位置的域称为指针域(链域),存储直接的下一个节点地址。 data域 + next域:组成数据的存储映射,称为结点;注意:链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。 每个结点只有一个链域的链表称为单链表(Single L...

2019-06-29 20:52:45 2887

转载 ThreadPoolExecutor讲解(JDK1.6)

使用多线程可以提高程序的执行效率,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间。那么有没有一种办法使得线程可以复用,就是执行完一个任务,并不被销毁,而是可以继续执行其他的任务?在Java中可以通过线程池来达到这样的效...

2019-06-29 17:06:30 625

原创 synchronized与Lock的区别

之前面试的时候经常会被问到一个问题,就是synchronized与Lock有什么区别,当时回答的很模糊,回来之后对这个知识点深入了解了一下,现在给自己总结。类别 synchronized Lock 存在层次 Java的关键字,在jvm层面上 是一个类 锁的释放 会自动释放锁(1、以获取锁的线程执行完同步代码,释放锁 2、线程执行发生异常,jvm会让线程释放...

2019-06-29 12:06:34 481

原创 String、StringBuilder、StringBuffer对比

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。类名 String StringBuffer StringBuilder 线程安全 安全(final修饰) 安全 不安全 字符串类型 常量 变量 变量 执行效率 最慢 介于二者之间 最快 1.线程安全String类是用final修饰符修饰...

2019-06-27 20:59:51 155

原创 String字符串反转

这道题在面试的时候被问过,在此给大家分享一下。方法一、通过StringBuiler的reverse()的方法,最快的方式。public static String reverseStringBuilder(String s) { StringBuilder sb = new StringBuilder(s); String reverse = sb.reverse().t...

2019-06-25 22:41:15 21613 1

原创 Java多线程面试题

https://www.cnblogs.com/kexianting/p/8566318.html

2019-06-16 09:45:33 168

转载 Redis主从同步(复制)

一、概述在现有企业中80%公司大部分使用的是redis单机服务,在实际的场景当中单一节点的redis容易面临风险。面临问题 机器故障。我们部署到一台 Redis 服务器,当发生机器故障时,需要迁移到另外一台服务器并且要保证数据是同步的。而数据是最重要的,如果你不在乎,基本上也就不会使用 Redis 了。 容量瓶颈。当我们有需求需要扩容 Redis 内存时,从 16G 的内存...

2019-06-03 18:14:08 1867

转载 Redis事务讲解

一、引言为了确保连续多个操作的原子性,一个成熟的数据库通常都会有事务支持,Redis 也不例外。Redis 的事务使用非常简单,不同于关系数据库,我们无须理解那么多复杂的事务模型,就可以直接使用。不过也正是因为这种简单性,它的事务模型很不严格,这要求我们不能像使用关系数据库的事务一样来使用 Redis。一个事务从开始到执行会经历以下三个阶段:开始事务。 命令入队。 执行事务。在M...

2019-06-01 23:55:30 183

原创 Redis Pipeline讲解

一、pipeline出现的背景Redis是一种基于客户端-服务端(CS)模型以及请求/响应协议的TCP服务,这意味着通常情况下一个请求会遵循以下步骤:客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。 服务端处理命令,并将结果返回给客户端。这样一次命令消耗的时间就包括四个部分:请求从客户端到服务器的时间、命令排队的时间和命令真正执行时间、结果从服...

2019-05-29 19:24:36 2625 1

原创 Redis持久化

Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能、持久存储、适应高并发应用场景等优势。它虽然起步较晚,但发展却十分迅速。由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能,将数据保存到磁盘上,当redis重启后,可以从磁盘中恢复数据。redis提供两种方式进行持久化,一种是RDB...

2019-05-23 23:41:18 129

转载 Redis I/O 多路复用

引出IO多路复用为什么 Redis 中要使用 I/O 多路复用这种技术呢?首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。要弄清问题先要知道问题的出...

2019-05-19 19:18:01 28915

转载 高性能IO模型浅析

最近在学习Redis,了解到Redis是单线程的,但是运用了I/O 多路复用技术,可以并发响应多个客户端请求。下面来了解一下常见的IO模型。服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:(1)同步阻塞IO(BlockingIO):即传统的IO模型。 (2)同步非阻塞IO(Non-blockingIO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设...

2019-05-16 23:39:47 323

转载 Redis线程安全问题

Redis是线程安全的吗?Redis是个单线程程序,所以它是线程安全的。Redis单线程为什么还能这么快?Redis是基于内存的,内存的读写速度非常快; Redis是单线程的,避免了不必要的上下文切换和竞争条件; Redis使用多路复用技术,可以处理并发的连接。非阻塞I/O内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转...

2019-05-16 17:29:26 19887 5

转载 Oracle insert all 讲解

1、概念Oracle 中insert all 是指把 同一批 数据插入到 不同的表 中。假如,现在有个需求,把表 t 的中数据分别插入到 t1、t2,如果你不知道 insert all, 你可能会使用 insert 插入 2 次,例如:INSERT INTO t1(object_id, object_name) SELECT * FROM t;INSERT INTO t2(obje...

2019-05-08 22:36:09 1261

转载 HashMap为什么是线程不安全的

HashMap的容量是有限的,当经过多次元素插入,使得HashMap达到一定饱和度时,Key映射位置发生冲突的几率会逐渐提高。这时候,HashMap需要扩展它的长度,也就是进行resize。影响发生resize的因素有两个:1.capacity:HashMap数组长度,默认初始为16。HashMap的长度是2的幂。2.loadFactor:负载因子,默认值为0.75f。衡量Hash...

2019-04-11 00:15:20 389 1

转载 数据结构之栈与队列

1.栈与队列栈与队列是程序设计中广泛使用的两种重要的线性数据结构。栈是LIFO(Last In First Out),先存进去的数据只能最后被取出来,进出顺序逆序,即先进后出,后进先出。队列是FIFO(First In First Out),它保持进出顺序一致,即先进先出,后进后出。4.如何使用两个栈模拟队列操作public class TwoStackForQueue&...

2019-04-09 23:13:58 260

转载 LinkedList实现栈和队列操作

LinkedList 不仅实现了List接口还实现了Dueue接口(双端队列,既具有队列的特征,也具有栈的特征),Dueue接口是Queue的子接口。它也可以被当作堆栈、队列或双端队列进行操作。LinkedList 实现 List 接口,能对它进行队列操作。LinkedList 实现 Deque 接口,能将LinkedList当作双端队列使用。使用LinkedList实现堆栈impo...

2019-04-09 21:47:24 1452

原创 队列Queue

队列是一种数据结构,它只允许在队列尾部(rear)加人一个元素,和从队列头部(front)移除一个元素。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。在队列这种数据结构中,最先插入的元素将是最先被删除的元素;反之最后插入的元素将是最后被删除的元素,因此队列又称为“先进先出”(FIFO—first in first out)的线性表。Queue的实现...

2019-04-04 17:52:54 306

原创 List与Array转换

List to ArrayList 提供了toArray的接口,所以可以直接调用转为object型数组:List<String> list = new ArrayList<String>();Object[] array=list.toArray();上述方法存在强制转换时会抛异常,下面此种方式更推荐,可以指定类型:String[] array=lis...

2019-04-04 11:39:30 347

转载 ArrayList内部原理

简介ArrayList 是一种变长的基于数组实现的集合类,允许空值和重复元素,当往 ArrayList 中添加的元素数量大于其底层数组容量时,它会自动扩容至一个更大的数组。另外,由于 ArrayList 底层基于数组实现,所以其可以保证在 O(1) 复杂度下完成随机查找操作。其他方面,ArrayList 是非线程安全类,并发环境下,多个线程同时操作 ArrayList,会引发不可预知的错误...

2019-04-02 21:02:12 243 1

转载 ConcurrentHashMap原理分析(1.7)

一、出现背景1、线程不安全的HashMap先说HashMap,HashMap是线程不安全的,在并发环境下,可能会形成环状链表(扩容时可能造成,具体原因自行百度google或查看源码分析,参考https://blog.csdn.net/diweikang/article/details/89198811),导致get操作时cpu空转,所以,在并发环境中使用HashMap是非常危险的...

2019-03-27 22:14:35 1201 1

转载 HashSet的实现原理

1、HashSet概述:HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。2、HashSet的实现:对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,因此HashSet的实现比较简单,相关HashSet的操作,基...

2019-03-22 15:05:22 279

原创 String中equals()、hashCode()方法的作用与源码

String类中的equals()方法的源码如下: public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String...

2019-03-22 13:08:30 1263

转载 重写equal()时为什么也得重写hashCode()之深度解读

1.equals()的所属以及内部原理(即Object中equals方法的实现原理)说起equals方法,我们都知道是超类Object中的一个基本方法,用于检测一个对象是否与另外一个对象相等。而在Object类中这个方法实际上是判断两个对象是否具有相同的引用,如果是,它们就一定相等。其源码如下:public boolean equals(Object obj) { retu...

2019-03-21 22:24:14 625

转载 List集合去除重复对象

在java中,要将一个List中重复的对象除去,如果这个集合中的数据类型是基本数据类型,可以直接将List集合转换成Set,就会自动去除重复的元素,大家都知道Set集合的特点就是没有重复的,这个就相对比较简单,这里不在详细说,我们下面说的List集合中的数据类型是一个对象类型的情况。当List集合中存储的类型是对象类型的时候,我们就不能简单的只把List集合转换成Set集合就行了,这时我们需要...

2019-03-21 21:28:51 12424

Excel导入导出demo

Excel导入导出demo,导入支持2003和2007,通过了不同的方法。导出可以按javabean属性导出,也可以根据指定字段导出

2019-03-08

kindeditor4.1.10

在原有基础上增加文件上传、图片上传等功能。满足用户的各种需求

2014-04-10

空空如也

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

TA关注的人

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