- 博客(53)
- 收藏
- 关注
原创 Spring Boot Ribbon负载均衡配置的坑(避免被ComponentScan扫描)
配置Spring Boot Ribbon负载均衡配置很简单,网上一搜类似下面:@Configurationpublic class LoadBalanceConfiguration { @Bean public IRule rule() { return new WeightedResponseTimeRule(); }}坑在Ribb...
2018-09-19 17:08:57
2949
1
原创 Spring Boot 注解方式自定义Endpoint
概述在使用Spring Boot的时候我们经常使用actuator,健康检查,bus中使用/refresh等。这里记录如何使用注解的方式自定义Endpoint。可用于满足一些服务状态监控,或者优雅停机等。准备Spring Boot项目,pom中加入:<dependency> <groupId>org.springframework.boot</gr...
2018-06-06 16:07:28
12025
2
原创 Java还要再学一遍基础(十五)获取Unsafe
Java中的Unsafe被设计成我们不能随便访问,虽然也可以通过反射获取,但是没有经过严格测试的自己写的代码不能保证它的正确性,这里贴出谷歌api中的Unsafe获取方法,以备后用:private static sun.misc.Unsafe getUnsafe() { try { return sun.misc.Unsafe.getUnsafe(); ...
2018-05-31 10:58:41
726
原创 基于canal的Spring-Boot-Starter
前言 canal是阿里巴巴的基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql。可以用于比如数据库数据变化的监听从而同步缓存(如Redis)数据等。由于项目中基本都是使用的Spring-Boot,所以写了一个基于Spring-Boot的starter方便使用。特点使用方便。可以通过简单的配置就可以开始使用,当对某些操作感兴趣的时候可以通过注解或者注入接口实现的方...
2018-03-22 15:59:56
7571
2
原创 Spring Boot整合oauth2.0搭建统一授权服务(密码模式)
前言写这个博客得原因是最近想要将自己得api单独发布给第三方使用,但是又不想被别人滥用,所以想弄一个授权服务,但是网上关于oauth2.0的资料层出不穷,看了之后完全不明白应该如果实际的去整合,现在基本成功后记录下来。关于oauth2.0的概念以及相关的知识等可以建议参阅理解OAuth 2.0。准备新建一个Spring Boot的web项目并导入一下依赖:<depend...
2018-01-24 15:36:45
38623
37
原创 Spring Boot整合Swagger2
Spring Boot整合Swagger2关于swagger2的阐述以及使用等此处不做描述。整合步骤整合之前需要先创建一个Spring Boot的web项目。POM依赖导入 io.springfox springfox-swagger2 2.5.0 io.springfox springfox-swagger-ui 2.5.0配置@Confi
2018-01-22 15:29:52
538
原创 Java内存区域划分
阅读了《深入理解Java虚拟机》之后的学习记录。在理解了Java的内存区域划分的情况下对于出现OOM问题等一些列内存问题以及调优方面将会有很大的帮助,也可以让自己在编写代码的时候能够预防某些可能出现内存泄漏或者内存溢出的情况,编写高质量的代码。运行时数据区域Java虚拟机在运行的过程中会将虚拟机所管理的内存划分为若干个不同的区域,每个区域存放不同的数据担负着不同的职责。下面是运行时
2017-07-14 14:48:03
455
原创 Java还要再学一遍基础(十七)- Object的finalize方法
概述Object的finalize方法定义如下:protected void finalize() throws Throwable { }使用protected修饰,所以子类是可以重写该方法的。finalize方法将会在jvm对当前对象进行gc回收的时候调用。实例下面的代码简单的演示了finalize方法的使用:public class FinanizeEscap
2017-07-12 16:01:15
467
原创 根据二叉树的先序遍历和中序遍历重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。程序:public class Solution { public static void main(String[]
2017-07-11 17:19:40
476
原创 【Spring】 - lookup-method和replaced-method使用
概述lookup-method和replaced-method是在xml配置bean的时候的可选配置,其中lookup-method可以声明方法返回某个特定的bean,replaced-method可以改变某个方法甚至是改变方法的逻辑。使用(略过环境配置)定义一个User接口,和接口的两个实现Teacher和StudentUser接口:publi
2017-07-11 16:56:52
3063
原创 【Spring】- Bean的生命周期的init和destroy方法的三种方式
概述在Spring中,向容器中注入一个Bean的时候可能期望在Bean的创建或者Bean的销毁的时候“做一些事情”,Spring支持三种方式来让我们实现。实现方法准备HelloPrinter类:public class HelloPrinter { public void print() { System.out.println("hello"); }
2017-07-06 10:21:12
2297
原创 【Spring】 - 基于xml的两种依赖注入方式(构造函数注入,setter注入)
概述Spring中依赖注入dependency injection (DI)一般来说有两种形式: 1)基于xml的依赖注入, 2)基于注解的依赖注入。基于xml的依赖注入方式通常又可以分为:1)构造函数方式注入。2)setter方式注入。环境Spring4.3.9, JDK1.8 pom添加spring依赖如下: org.springframewo
2017-07-05 14:51:12
4651
原创 【Java并发】- 使用CompletionService异步收集任务结果
概述在使用Executor或者直接使用ExecutorService的时候,通常会提交很多个任务同时还需要等待任务的返回结果,这个时候如何快速的回收任务的结果就成了问题。而使用CompletionService可以生产新的异步任务与使用已完成任务的结果分离开来。比如前端页面的图片这种IO的任务,我们并不关心图片的顺序,只是希望能尽快的将图片展示出来。这个时候如果只是顺序的去取图片结果的话,
2017-07-03 15:13:03
1371
原创 Java还要再学一遍基础(十六)- DelayQueue使用
概述 DelayQueueDelayed>Delayed 元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部 是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且poll 将返回 null。当一个元素的 getDelay(TimeUnit.NANOSECONDS) 方法返回一个小于等于 0 的值时,将发生到期。即使无法使用
2017-07-03 14:06:47
520
原创 【Java并发】- ScheduledThreadPoolExecutor, ScheduledExecutorService使用
概述 ScheduledExecutorService的接口集成关系:Executor|---ExecutorService|--ScheduledExecutorService
2017-07-03 10:06:26
1355
原创 【MySQl】- 随机生成大量测试数据(测试用)
记录一个随机生成大量数据的存储过程(针对特定的表)第一步:创建表:CREATE TABLE `person` ( `id` bigint(20) unsigned NOT NULL, `fname` varchar(100) NOT NULL, `lname` varchar(100) NOT NULL, `age` tinyint(3) unsigned NO
2017-06-30 16:18:48
11988
3
原创 Java还要再学一遍基础(十五) - 接口的多继承
概述初学Java的时候经常都能看到--Java类不能继承多个类,但是可以实现多个接口。学了一段时间之后突然发现:原来接口还能继承接口。再过一段时间可能终于发现:接口可以继承多个接口!其实也是在情理之中,因为Java不支持继承多个类一定程度上是因为继承多个类而多个类拥有相同的方法的问题。但是接口不一样,一般来说接口里都是抽象类,所以不存在类的具体实现,就算多继承的时候有相同名
2017-06-28 10:21:39
540
原创 【Java设计模式】- 观察者模式
概述观察者模式又叫做发布订阅模式(Publish/Subscribe),定义了一个目标管理对象(Subject)和多个观察者对象(Observer),形成一个一对多的关系,当满足某种条件的时候由目标管理对象像所有依赖与自己的观察者对象发送通知。这种模式多用于事件处理。原理观察者模式类图:(图片来源于网络)Subject:抽象主题(角色),内部用某种数据结
2017-06-27 16:13:37
379
原创 【MySQL】-事务的隔离级别
概述在标准的SQL中事务的隔离级别一共有四种。事务的隔离级别主要定义了一个事务做出的修改在别的事务中的可见性情况。事务的隔离级别越高通常开销越低,同时并发程度也越高。事务的隔离级别在不同的存储引擎中的实现也是不尽相同的,这里只简单介绍四种标准的隔离级别。(本文很多摘抄自《MySQL》第三版)四种标准的隔离级别分别为:READ UNCOMMITTED(未提交读),READ COMMI
2017-06-27 12:21:37
458
原创 【Java设计模式】- 装饰器模式
概述 装饰器模式:可以动态的为运行时的类添加行为。相比继承而言,继承是直接对某个类的行为进行扩展而装饰器模式是对某个对象进行扩展。 原理:增加一个修饰类去实现被修饰类相同的接口,同时接收一个被修饰类的实例,并在修饰类中用自己的方法去包裹被修饰类的方法。 经常使用的Collections的synchronizedList(List list)等方法就是使用了装饰
2017-06-26 10:32:07
888
转载 以普通用户启动的Vim如何保存需要root权限的文件(转)
在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误:
2017-06-23 14:53:22
795
原创 【Java并发】 - CopyOnWriteArrayList,CopyOnWriteArraySet原理
概述CopyOnWriteArrayList, CopyOnWriteArraySet这两个容器类是从java1.5开始加入的java.util.concurrent包的。其中与HashSet类似的CopyOnWriteArraySet内部也是直接使用的CopyOnWriteArrayList,所以本文着重介绍CopyOnWriteArrayList(简称COW)的原理。CopyOnWri
2017-06-23 12:29:36
897
原创 【Java设计模式】- 迭代器模式
概述迭代器模式它可以让用户通过一个迭代器的接口去迭代访问容器中的每一个元素而不用去关心容器内部数据的具体数据结构及实现。优点:符合面向对象原则,将迭代的功能交给单一的迭代器去完成,同时使得容器可以拥有不同的迭代方式。缺点:增加了系统的复杂性。实现迭代器模式的类图通过一个抽象的迭代器接口去定义了迭代器的行为,同时抽象容器对象也为容器提供
2017-06-22 15:22:00
493
原创 centOS7下如何搭建memcached+mongodb+jdk+tomcat的基础应用环境
centOS7下如何搭建memcached+mongodb+jdk+tomcat的基础应用环境 本文主要介绍自己在centOS7下搭建服务环境的内容,略有简陋,格式也未过多调整,如有遇到其余问题,可私聊与我讨论。
2017-06-21 12:08:29
716
原创 【Java设计模式】- 单例模式
概述单例模式指的是一个类保证只有这个类的一个实例的存在,比如网站的访问计数器一般就是单例模式,否则很难实现同步。实现方式:懒汉式:单例的实例在第一次被使用时构建饿汉式:单例的实例在类加载的时候构建八种实现class Singleton1 { private static Singleton1 instance; private Singleton
2017-06-21 10:07:06
287
原创 Java还要再学一遍基础(十四)实现斐波那契数列
费波那契数列(意大利语:Successione di Fibonacci),又译为费波拿契数、斐波那契数列、费氏数列、黄金分割数列。指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)实现:/**递归实现 * @param n
2017-06-20 14:29:49
550
转载 【Java并发】 - Phaser使用(转)
OverviewJava 7的并发包中推出了Phaser,其功能跟CyclicBarrier和CountDownLatch有些重叠,但是提供了更灵活的用法,例如支持动态调整注册任务的数量等。本文在Phaser自带的示例代码基础上进行一下简单的分析。GlossaryRegistration Phaser支持通过register()和bulkRegister(int p
2017-06-19 16:33:24
1067
原创 【Java并发】 - Semaphore
概述Semaphore(信号量),通常用于限制某些资源的访问线程数量。通过调用aquire方法获取许可,没有获取到许可则阻塞当前线程直到获取到许可为止。操作完成后通过调用release方法来释放许可,从而允许其他线程去获取许可。同时Semaphore也支持超时的获取方式。从描述来看这基本和AQS的原理和使用方式如出一辙,只是将同步状态设置了一个上界。使用假设一个教室只允许5
2017-06-19 14:24:25
359
原创 【Java并发】 - Cyclicbarrier使用以及原理
CyclicBarrier概述 CyclicBarrier顾名思义是一个循环屏障,它允许一个或者多个线程之间互相等待,直到所有的线程都到达某个点这个时候屏障打开。而且这个屏障可以循环的使用。CyclicBarrier使用 假设有五个学生要考试,要求需要等到所有的学生都来齐了之后由老师宣布考试开始然后学生才能开始作答。public class CyclicBarrierD
2017-06-19 12:08:46
607
原创 【Java并发】 - CountDownLatch使用以及原理
概述CountDownLatch是一个用来控制并发的很常见的工具,它允许一个或者多个线程等待其他的线程执行到某一操作,比如说需要去解析一个excel的数据,为了更快的解析则每个sheet都使用一个线程去进行解析,但是最后的汇总数据的工作则需要等待每个sheet的解析工作完成之后才能进行,这就可以使用CountDownLatch。使用例子:这里有三个线程(main,threa
2017-06-19 09:15:01
13445
1
原创 【Java并发】 - ThreadPoolExecutor详解
概述在编写并发应用的时候通常都可以使用线程池,因为比起我们自己手动的去创建新的线程并去开启线程线程池能够通过它自身对于线程的生命周期的管理来完成线程的复用这样就减少了反复创建线程的开销降低了资源的消耗。在Java中Executor接口中只定义了一个简单的功能,它能够执行传来的Runnable的任务。void execute(Runnable command);
2017-06-16 12:42:15
474
原创 【Java并发】- ConcurrentHashMap原理解析(JDK1.8)
ConcurrentHashMap概述在JDK1.8中ConcurrentHashMap的实现方式或者说实现思想相比之前的版本已经相差了很大了,在JDK1.8之前ConcurrentHashMap是采用的是Segment(分段锁)的方式,而JDK1.8中的ConcurrentHashMap则摒弃了原来的做法,同时沿用了JDK1.8中的HashMap的数组+链表+红黑树的方式,同时大量的使用了java
2017-06-15 16:05:06
1145
转载 【Java并发】- ConcurrentHashMap原理解析(Segment版本)(转)
ConcurrentHashMap原理解析原文链接:http://www.iteye.com/topic/1103980ConcurrentHashMap是一个线程安全的哈希表结构,它的主要功能是提供了一组和HashTable功能相同但是线程安全的方法。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个Conc
2017-06-14 15:22:05
4493
原创 【Java并发】- StampedLock实现浅析
StampedLock实现概述StampedLock与之前的ReentrantLock,ReentrantReadWriteLock使用队列同步列AQS实现有所不同,StampedLock的state改为了一个long型的变量,同时状态的设计也有所不同。同时由于没有使用AQSStampedLock直接在内部实现了同步等待队列,并且节点属性中有一个叫做cowait的分支用于标识另一个等待获取读状态的链
2017-06-14 14:02:56
1080
原创 【Java并发】- StampedLock使用
StampedLock概述StampedLock是从JDK1.8开始引入的,它的出现对于ReentrantReadWriteLock在读多写少的情况下的效率问题还有写线程容易产生“饥饿”的问题有了很大的解决。ReentrantReadWriteLock 在沒有任何读写锁时才能获取到写锁,StampedLock认为尝试获取读锁的时候如果有写锁存在不应该是阻塞而是重读,而且在StampedLock的乐观
2017-06-14 10:50:37
1498
原创 【Java并发】- ReentrantReadWriteLock,读写锁原理
ReentrantReadWriteLock(读写锁)读写锁概述ReentrantReadWriteLock,读写锁或者重入读写锁,它维护了一个读锁和一个写锁,可以达到多个读线程可以共享的获取到锁,而此时写线程不能获取到锁,并且当写线程获取到锁时后续的读写都将被阻塞不能获取到锁。读写锁保证了写操作对后续的读操作的可见性。同时ReentrantReadWriteLock还支持重入,公平性选择以及锁的降
2017-06-13 15:36:12
2579
1
原创 【Java并发】- ReentrantLock,重入锁
ReentrantLock概述ReentrantLock(重入锁),顾名思义是可以重新进入的锁,也就是说当一个线程获取了这个锁之后还能在释放锁之前再次获取这个锁,同时还支持公平所和非公平锁的选择。ReentrantLock的重入重入例子synchronized就很好的支持了重入: 例: public class ReentrantLockDemo { public static void m
2017-06-13 10:19:09
574
原创 Java还要再学一遍基础(十三)foreach循环
foreach的使用List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);for(int v : list) System.out.println(v);上面的代码将输出:1234foreach是java对于for循环的一种增强,或者说增强的for循环。它能够
2017-06-12 17:20:10
409
原创 【Java并发】- AbstractQueuedSynchronizer详解(AQS)
AQS简介AQS(队列同步器),是用于构建锁或者同步组件的基础框架,通过使用一个int型的state变量来表示资源(或者同步状态),同时使用内部的一个FIFO队列来实现多个线程获取资源的排队,在构建相应的锁或者同步组件的时候一般都是以继承AQS并实现其中部分关键的方法来达到锁的功能,同时AQS也提供一些状态的读写的方法如:getState(),setState(int newState),compa
2017-06-12 13:52:45
651
原创 【Java并发】- volatile详解
在这之前需要先了解java内存模型volatile特性可见性。对一个volatile变量的读,总能看到(任意线程)对这个volatile变量最后的写入。原子性。对任意一个volatile单个变量的读/写具有原子性。但是类似于volatile++这种不具有原子性。因为volatile只保单个证读写具有原子性,这里的volatile++相当于1)读volatile的值,2)volatile + 1,
2017-06-09 13:18:54
584
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人