- 博客(84)
- 收藏
- 关注
原创 spring boot2.x下 使用feign,注解@EnableFeignClients 找不到的解决方法
在spring boot1.x下,使用注解@EnableFeignClients,jar包依赖是:<!-- feign远程调用 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId&...
2019-11-10 15:40:10
661
原创 springcloud 在客户端配置ribbon负载均衡常见问题
客户端消费服务时,后台抛出java.lang.ClassNotFoundException: com.google.common.reflect.TypeToken异常或者Factory method 'eurekaClient' threw exception; nested exception is java.lang.NoClassDefFoundError: com/google/...
2019-11-10 15:25:04
355
原创 bean 作用域和生命周期
bean的作用域分为singleton:单例prototype:多例request:每次http请求产生一个实例,仅在当前request内有效session:每次http请求产生一个实例,仅在当前session内有效globalsession:类似于标准的 HTTP session 作用域,不过仅仅在基于 portlet 的 web 应用中才有意义bean的生命周期Be...
2019-09-15 22:32:33
176
原创 NIO的理解
NIO是同步非阻塞,核心是通道和缓冲区,通道用于传输数据,缓冲区用于存储数据。1.缓冲区可以保存多个相同类型的数据,例如:ByteBuffer CharBuffer DoubleBuffer FloatBuffer IntBuffer LongBuffer MappedByteBuffer ShortBuffer2.通道和选择器Channel和Selector F...
2019-09-15 16:42:43
145
原创 23种设计模式
1.创建型模式:单例模式、抽象工厂模式、工厂模式、原型模式、建造者模式 5种2.结构型模式:适配器模式、装饰模式、桥接模式、组合模式、外观模式、享元模式、代理模式 7种3.行为型模式:模板方法模式、命令模式、访问者模式、迭代器模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、责任链模式 11种...
2019-09-08 23:19:55
107
原创 redis缓存雪崩和缓存穿透解决方案
1.缓存雪崩:缓存同一时间大面积失效,导致大量的请求都落在了数据库上,造成数据库承受压力增大以致最后的雪崩解决办法:事前:保证redis集群的高可用,发现机器宕机后能够尽快补上,选择合适的内存淘汰机制,淘汰掉过期的数据 事中:本地ehcache缓存和限流机制,保证mysql运行 事后:利用redis持久化机制尽快恢复数据...
2019-08-25 15:44:52
350
原创 网络七层模型与简化后的四层模型
七层模型从下到上依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层物理层:底层数据传输,如网线,网卡标准数据链路层:定义数据的基本格式,如何传输,如何标识,如网卡MAC地址网络层:定义IP地址,定义路由功能,如不同设备的转发传输层:端到端传输数据的功能,如TCP、UDP会话层:控制应用程序之间会话的能力,如不同软件发送数据给其它软件标识层:数据格式标识,基本...
2019-08-17 23:38:34
800
原创 插值查找算法
原理:插值查找算法类似于二分查找法,但不同的是中间值mid不是取中间的值,而是自适应的中间值。求mid索引的公式为left、right为第一位和末位的索引,findVal为要查找的值注意事项:1.对于数据量较大,分布均匀的查找表来说,插值查找速度较快2.对于分布不均匀的查找表来说,插值查找不一定比折半查找来的好...
2019-08-15 23:44:35
391
原创 常用排序算法的介绍
1.冒泡排序基本思想:从前向后依次比较相邻元素的大小,若逆序则交换位置,使得较大的元素往后放,最后形成从小变大的顺序。2.选择排序基本思想:首先从一组需要排序的数据中找出最小的数,然后放到首位,就是与第一位交换位置,然后再从剩下的数据中找出最小的与当前剩下的数据中的第一位交换,以此类推,最终按照从小到大的顺序排列。3.插入排序基本思想:设有一组数据(k1,k2,k3.....k...
2019-08-15 22:51:29
197
原创 垃圾回收器的分类
垃圾回收器分为新生代和老年代垃圾回收器。新生代垃圾回收器:Serial(单线程)、ParNew(多线程)、Parallel Scavenge(多线程)老年代垃圾回收器:Serial Old(单线程)、Parallel Old(多线程)、CMS(标记-清除算法)整堆回收器:G1新生代垃圾回收器一般采用复制算法回收垃圾,优点是效率高,缺点是内存利用率低老年代垃圾回收器一般采用标记-...
2019-08-13 23:05:31
250
原创 JVM的组成部分及解释
JVM主要分为类加载器,运行时数据区,执行引擎,本地库接口。流程是类加载器将代码转化为字节码,运行时数据区再将字节码加载到内存中,而系统底层并不能识别字节码,这是需要命令解析执行引擎把字节码转化为指令,cpu通过调用本地库接口执行这些指令。运行时数据区又分为堆,方法区,虚拟机栈,本地方法栈,程序计数器。堆:内存中最大的一块,负责存储实例对象,所有线程共享方法区:用于存储类信息,常量...
2019-08-13 22:55:40
276
原创 类加载机制,双亲委派模型
类装载过程:1.加载:根据路径找到类加载到内存中2.验证:验证class类的准确性3.准备:给类中的静态变量分配空间4.解析:虚拟机将常量的符号引用变为直接引用,符号引用只是一个标示,而直接引用就是指向内存中的地址5.初始化:对静态变量和静态代码块进行初始化工作类加载器分类:1.jvm角度:启动类加载器和其它类加载器2.Java开发角度:启动类加载器,扩展类加载器,...
2019-08-13 21:38:55
125
原创 synchronized和lock的区别
1.synchronized是关键字,属于jvm层面;monitorenter(底层是通过monitor对象来完成,wait/notify也依赖于monitor对象只有在同步块和方法中才能调用wait/notify等方法) monitorexit(包括正常退出和异常退出两种); 而lock是一个类,属于api层面2.synchronized执行完同步代码,自动释放锁;Lock锁必须在fi...
2019-08-11 19:38:03
158
原创 线程池底层工作原理和流程
当提交任务执行excute时1.若正在运行的线程数量小于corePoolSize,则线程池马上创建线程执行任务2.如果正在运行的线程数量大于等于corePoolSize,则多余的任务加入阻塞队列等待3.如果队列满了且正在运行的线程数量小于maximumPoolSize,那么还要创建非核心线程执行没有加入队列的任务4.如果队列满了且正在运行的线程数量大于或等于maximumPoolS...
2019-08-10 17:38:04
178
原创 自定义线程池和合理配置线程数
不要用Excutors定义线程池,用ThreadPoolExcutor自定义public class ExcutorDemo { public static void main(String[] args) { //ExecutorService threadPool = Executors.newFixedThreadPool(20);//一池20个线程 ...
2019-08-09 23:49:38
504
原创 线程池七大参数
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, ...
2019-08-09 21:43:19
3666
原创 CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch:让一些线程阻塞直到另一些线程完成操作才被唤醒;完成操作时计数器减为0,阻塞线程被唤醒。public class CountDownLatchDemo { public static void main(String[] args) throws InterruptedException { CountDownLatch countDow...
2019-08-04 16:02:57
105
原创 读写锁 ReadWriteLock
多个线程可以同时去读取同一个资源,但是每次只能有一个线程去写资源,不应该有其它线程去写资源。写资源时应该满足原子和独占性。读-读 能共存读-写不能共存写-写不能共存class MyCache{ private volatile Map map = new HashMap(); private ReadWriteLock lock = new Reentra...
2019-08-04 14:52:36
91
原创 可重入锁和递归锁
可重入锁也称递归锁。可重入锁指的是同一个线程进入外层函数获得锁,内层同步函数仍然可以使用该锁,并且不会发生死锁。ReentrantLock和synchronized默认都是可重入锁。class Phone implements Runnable{ //可重入锁 ReentrantLock Lock lock = new ReentrantLock(); ...
2019-08-04 13:29:00
151
原创 公平锁 和非公平锁的含义和区别
公平锁:多线程按照申请锁的顺序来获取锁,不会出现争抢的情况。非公平锁:多线程不会按照顺序获取锁,会先尝试去争抢锁,有可能后申请的线程比先申请的线程先抢到锁,在高并发情况下,可能会造成优先级反转和饥饿的现象。(例如ReentrantLock默认为非公平锁)区别:公平锁就是很公平,争抢锁的几率一样,每个线程会先看等待队列是否为空,若为空,直接获取锁,若不为空,自动排队等候获取锁;非公平锁...
2019-08-03 23:09:51
4076
原创 CAS是什么及底层原理
个人理解:CAS全称CompareAndSwap(比较并交换),是一种硬件对并发支持所设计的特殊指令,实现了无锁的非阻塞算法。算法主要是包含读写值,期望值,更新值,当期望值与主内存读到的值相等时,才会通过原子方式更新主内存值,否则就表示已有其它线程更新过主内存的值,这时当前线程CAS指令继续循环读取值 做比较 直到相等为止,才更新成功,结束指令。CAS底层主要实现类为UnSafe类,为...
2019-08-01 00:50:49
945
转载 分布式环境中并发问题
在分布式环境中,处理并发问题就没办法通过操作系统和JVM的工具来解决,那么在分布式环境中,可以采取一下策略和方式来处理:避免并发时间戳串行化数据库行锁统一触发途径避免并发在分布式环境中,如果存在并发问题,那么很难通过技术去解决,或者解决的代价很大,所以我们首先要想想是不是可以通过某些策略和业务设计来避免并发。比如通过合理的时间调度,避开共享资源的存取冲突。另外,在并行任务设计上...
2019-07-28 23:00:41
557
原创 ThreadLocal的作用和原理
ThreadLocal是用来创建当前线程的局部变量的类,创建的变量只能被当前线程访问和修改原理:set方法的原理:1.首先获取当前线程对象2.利用当前线程获取ThreadLocalMap对象3.如果ThreadLocalMap对象不为空,则设置值,否则创建这个Map对象并设置值由此可看出ThreadLocal变量的值是放入了当前线程创建的ThreadLocalMap对象中,...
2019-07-28 21:30:06
242
原创 volatile关键字的作用和原理
作用是使得变量在多线程间是可见的,强制从公共数据栈中取得变量的值,而不是从线程私有数据栈中取变量的值。原理(初步认识):1.首先实现可见性,需要满足两点,第一点是线程在私有内存中改变变量值后要强制刷新主内存中对应变量的值,第二点是线程在私有内存中操作变量时,其它线程私有内存中的对应变量自动失效,这样这些线程下次访问时会直接从主内存中取值。2.实现有序性,JMM会对volatile变量限...
2019-07-28 19:47:38
266
转载 创建线程池的几种方式以及线程池的好处
线程池的好处大致有三种:1.降低资源消耗2.提高响应速度3.提高线程的可管理性。使用线程池可以进行资源的统一分配、调优和监控。Java通过Executors提供四种线程池,分别为:newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。newFixedThreadPool 创建一个定长线程池,可控制...
2019-07-28 17:27:12
2408
原创 什么是死锁以及怎么排查死锁
死锁是指两个或两个线程自己持有锁并去争抢其他资源造成的互相等待的现象。产生死锁的主要原因:1.因为系统资源不足2.进程运行推进的顺序不合适3.资源分配不当产生死锁的四个必要条件:1.互斥条件2.占有且等待3.不可强行占有4.循环等待条件/** * 死锁case */public class DeadLock implements Runnable{...
2019-07-28 16:46:23
2386
1
原创 java多线程间的通信方式
通过共享变量,每个线程主动去读取共享变量的值,为了保证变量的并发同步,需要加volatile修饰 采用sleep/while无限循环方式,一个线程sleep后,另外的线程while轮询检测机制,但是此种方式比较浪费cpu资源,故不建议采用 采用wait/notify等待通知机制,当前线程调用wait()方法后,会释放对象锁,另外的线程如果持有对象锁之后,调用notify(),会随机唤醒一个正在...
2019-07-28 16:29:38
259
原创 HashMap的长度为什么要是2的幂次方
HashMap存储数据时要避免位置碰撞且数据分配均匀,于是采用位移运算的算法计算存储链表的位置,假设HashMap的长度不为2的幂次方则有可能产生碰撞,例如例如长度为9时候,3&(9-1)=0 2&(9-1)=0 ,都在0上,碰撞了;例如长度为8时候,3&(8-1)=3 2&(8-1)=2 ,不同位置上,不碰撞;...
2019-07-28 00:54:29
1251
原创 ConcurrentHashMap在jdk7和8中的实现原理
jdk7: 在jdk7中是以数组+分段锁(segement)+链表的方式实现,Segment继承自ReentrantLock 使用分段锁的方式是将数据分成一块一块的存储,然后给每一块数据配一把锁,当一个线程访问一块数据的时候,其它线程也可以访问其它块的数据,实现并发访问,大大提高并发访问的能力。 jdk8:在jdk8中是以数组+链表+红黑树的方式实现,彻底放弃Segeme...
2019-07-28 00:39:20
303
原创 接口和抽象类的区别
1.抽象类可以有构造方法,接口没有2.抽象类方法可以有public protected default这些修饰符,而接口只能用public3.抽象类可以有默认方法是实现的,接口方法不能实现4.抽象类单继承,接口多实现5.抽象方法比接口速度快,因为接口需要去寻找类中实现的方法...
2019-07-26 00:46:42
78
原创 springmvc处理流程
1.中央控制器DispatcherServlet拦截发送的请求,然后调用处理器映射器找到处理器2.处理器返回HandlerExcutionChain到中央处理器,然后中央处理器通过处理器适配器调用具体的处理器Handler(即Controller)3.处理器返回ModelAndView到中央处理器,然后中央处理器调用视图解析器解析视图返回view,最后渲染视图展示出来...
2019-07-25 01:01:20
95
原创 同步异步,阻塞非阻塞的区别
1.同步异步:消息通知机制 同步:当发起调用时,被调用者需要执行完才返回结果,调用者要主动等待结果返回。 异步:发起调用后,被调用者直接返回,但是并没有返回结果,被调用者处理完通过状态或通知等通知调用者,调用者被动接受结果。2.阻塞非阻塞:程序等待结果时的状态 阻塞:调用结果返回之前,程序不释放cpu,直接挂起线程,不能做其他事情,直到结果返回,才能继续往下执行。 ...
2018-10-24 19:42:12
116
原创 centos7 操作防火墙
操作默认防火墙firewalld1.//临时关闭 systemctl stop firewalld //禁止开机启动 systemctl disable firewalld Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service. Removed symlink /...
2018-10-23 19:00:59
265
原创 spring 七种事务传播行为和五种事务隔离级别
事务传播行为:propagation_控制事务传播行为1.REQUIRED(默认值):如果当前有事务,就在事务中执行;如果没有事务,就新建一个事务2.SUPPORTS:如果当前有事务,就在事务中执行;如果没有事务,就在非事务状态下执行3.MANDATORY:必须在事务内部执行,如果当前有事务,就在事务中执行;如果没有事务,就报错4.REQUIRES_NEW:必须在事务内部执行,如果...
2018-10-21 20:00:43
147
原创 解析xml的四种方式
1.DOM解析,官方的解析方式2.SAX解析,民间的解析方式,基于事件解析3.JDOM解析,第三方解析方式,比DOM解析快4.DOM4J解析,性能最好,是JDOM的升级版 DOM4J解析案列:1.先引入dom4j的jar包2.读取xml文件信息public class TestXml {public static void main(String[] args) ...
2018-10-19 16:46:11
371
原创 面向对象的基本原则
五个基本原则单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。 开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。 Lis...
2018-07-11 14:33:42
376
原创 日期时间格式化 (精确到时分秒)
function getNowFormatDate() { var date = new Date(); var seperator1 = "-"; var seperator2 = ":"; var month = date.getMonth() + 1; var strDate = date.getDate(); if (month >= ...
2018-06-19 14:15:14
13541
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人