自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(34)
  • 资源 (3)
  • 收藏
  • 关注

原创 Long源码分析。

public final class Long extends Number implements Comparable<Long> { /* * 继承Number类提供将表示的数值转换为 byte、double、float、int、long 和 short 的方法。<br /> * 实现Comparable接口,获取到compareTo方法。...

2018-12-29 17:19:22 631

原创 Integer源码分析。

public final class Integer extends Number implements Comparable<Integer> { /* * 继承Number类提供将表示的数值转换为 byte、double、float、int、long 和 short 的方法。<br /> * 实现Comparable接口,获取到compar...

2018-12-28 17:24:28 438

原创 解决方案:Solr索引删除。

在客户端删除指定id&lt;delete&gt;&lt;id&gt;id值&lt;/id&gt;&lt;/delete&gt;&lt;commit/&gt;在客户端删除所有索引&lt;delete&gt;&lt;query&gt;*:*&lt;/query&gt;&lt;/delete&gt;&lt;commit/&gt; 用ur

2018-12-26 11:47:13 1712

转载 前端:iframe父子页面的相关处理。

js在iframe子页面操作父页面元素window.parent.document.getElementByIdx_x("父页面元素id");js在父页面获取iframe子页面元素window.frames["iframe_ID"].document.getElementByIdx_x("子页面元素id");jquery在iframe子页面获取父页面元素$("#objid...

2018-12-24 19:11:24 246

原创 String源码分析。

/** * String是final修饰的,说明是不能被继承的,是最终类。<br /> * 首先实现了Serializable接口用于序列化。<br /> * 然后实现了Comparable接口,实现compareTo()方法来用于对比当前对象和传入对象的大小。<br /> * 最后实现了CharSequence接口,实现length()方法,char...

2018-12-20 15:37:39 332

转载 位运算符。

说明&gt;&gt;(按位右移) &lt;&lt;(按位左移) &gt;&gt;&gt;(按位右移不足补0),表示无符号右移,右移表达式的位,不保留符号形式result = expression1 &gt;&gt;&gt; expression2参数result——任何变量。 expression1——任何表达式。 expression2——任何表达式。说明&gt;...

2018-12-18 11:39:29 217

原创 Spring Boot:条件化注解。

条件化注解 配置生效条件 @ConditionalOnBean 配置了某个特定Bean @ConditionalOnMissingBean 没有配置特定的Bean @ConditionalOnClass Classpath里有指定的类 @ConditionalOnMissingClass Classpath里缺少指定的类 @ConditionalO...

2018-12-17 14:26:46 264

原创 解决方案:Failed to load the JNI shared library。

问题启动Eclipse时报错:Failed to load the JNIshared library。原因Java与Eclipse两个软件的位数不一样,存在冲突。解决方案卸载掉其中一个,重新安装。建议安装时,要与当前电脑系统的位数一致。...

2018-12-17 13:24:44 395

原创 解决方案:枚举类根据key值获取value值。

下面是一个根据key值获取枚举类相应的value值的方法。第一种方法 public static String getValue(String code) { for (TestEnum ele : values()) { if(ele.getCode().equals(code)) return ele.getValue(); } return null; }第...

2018-12-17 09:43:26 45217 2

转载 Spring Boot精要。

Spring Boot将很多魔法带入了Spring应用程序的开发之中,其中最重要的是以下4个核心。自动配置:针对很多Spring应用程序常见的应用功能,Spring Boot能自动提供相关配置。 起步依赖:告诉Spring Boot需要什么功能,他就能引入需要的库。 命令行界面:这时Spring Boot的可选特性,借此你只需写代码就能完成完整的应用程序,无需传统项目构建。 Actuat...

2018-12-14 15:45:47 220

转载 并发:FutureTask详解。

FutureTask接口和实现Future接口的FutureTask类,代表异步计算的结果。FutureTask简介FutureTask除了实现Future接口外,还实现了Runnable接口。因此,FutureTask可以交给Executor执行也可以由当调用线程直接执行(FutureTask.run())。根据FutureTask.run()方法被执行的时机,FutureTask可以处...

2018-12-13 09:23:03 1037

转载 并发:ScheduledThreadPoolExecutor详解。

ScheduledThreadPoolExecutor继承自ThreadPoolExecutor。他主要用来给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而ScheduledThreadPoolExecutor可以在构...

2018-12-12 16:25:06 1676 2

转载 并发:ThreadPoolExecutor详解。

Executor框架最核心的类是ThreadPoolExecutor,他是线程池的实现类,主要由下列4个组件构成。corePool:核心线程池的大小。 maximumPool:最大线程池的大小。 BlockingQueue:用来暂时保存任务的工作队列。 RegjectedExecutionHandler:当ThreadPoolExecutor已经关闭或ThreadPoolExecutor...

2018-12-12 15:45:36 585

转载 并发:Executor框架简介。

在HotSpot VM的线程模型中,Java线程(java.lang.Thread)被一对一映射为本地操作系统线程。Java线程启动时会创建一个本地操作系统线程;当该Java线程终止时,这个操作系统线程也会被回收。操作系统会调度所有线程并将他们分配给可用的CPU。在上层,java多线程程序通常把应用分解为若干个任务,然后使用用户级的调度器(Executor框架)将这些任务映射为固定数量的线程;...

2018-12-12 14:56:25 314

转载 并发:线程池的使用。

线程池的创建我们可以通过ThreadPoolExecutor来创建一个线程池。new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, milliseconds, runnableTaskQueue, handler);创建一个线程池时需要输入几个参数。如下。corePoolSize(线程池的基本大小...

2018-12-12 10:42:59 160

转载 架构:线程池的实现原理。

Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池。在开发过程中,合理的使用线程池能够带来3个好处。第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的...

2018-12-12 09:08:26 324

转载 并发:线程间交换数据的Exchanger(交换者)。

Exchanger是一个用于线程间协作的工具类。Exchanger用于进行线程间的数据交换。他提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。这两个线程通过exchange方法交换数据,如果第一个线程先执行exchange()方法,他会一直等待第二个线程也执行exchange方法,当两个线程都达到同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。下面来看一下Exc...

2018-12-11 15:50:46 412

转载 并发:控制并发线程数的Semaphore(信号量)。

Semaphore是用来控制同时访问特定资源的线程数量,他通过协调各个线程,以保证合理的使用公平资源。多年以来,我都觉得从字面上很难理解Semaphore所表达的含义,只能把他比作是控制流量的红绿灯。比如xx马路要限制流量,只允许同时有一百两车在这条路上行使,其他的都必须在路口等待,所以前一百辆车会看到绿灯,可以开进这条马路,后面的车会看到红灯,不能驶入xx马路,但是如果前一百辆中有5辆车已经...

2018-12-11 15:42:18 974

转载 并发:CyclicBarrier和CountDownLatch的区别。

CountDownLatch的计数器只能使用一次,而CyclicBarrier的计数器可以使用reset()方法重置。所以CyclicBarrier能处理更为复杂的业务场景。例如,如果计算发生错误,可以重置计数器,并让线程重新执行一次。CyclicBarrier还提供其他有用的方法,比如getNumberWaiting方法可以获取CyclicBarrier阻塞的线程数量。isBroken()方...

2018-12-11 15:02:11 278

转载 并发:CyclicBarrier(同步屏障)。

CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。他要做的事情是,让一组线程达到一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程达到屏障时,屏障才会开门,所有屏障拦截的线程才会继续运行。CyclicBarrier简介CyclicBarrier默认的构造方法是CyclicBarrier(int parties),其参数表示屏障拦截的线程数量,每个线...

2018-12-11 14:55:05 775

转载 并发:等待多线程完成的CountDownLatch(倒数计时器)。

CountDownLatch允许一个或多个线程等待其他线程完成操作。假如有这样一个需求:我们需要解析一个Excel里多个sheet的数据,此时可以考虑使用多线程,每个线程解析一个sheet里的数据,等到所有的sheet都解析完之后,程序需要提示解析完成。在这个需求中,要实现主线程等待所有线程完成sheet的解析操作,最简单的做法是使用join()方法,如下所示。public class ...

2018-12-11 14:12:13 555

转载 并发:Java中的13个原子操作类。

当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized会保证多线程不会同时更新变量i。而Java从JDK 1.5开始提供了...

2018-12-11 13:36:03 228

转载 算法:工作窃取算法(work-stealing)。

工作窃取算法是指某个线程从其他队列里窃取任务来执行。那么,为什么需要使用工作窃取算法呢?假如我们需要做一个比较大的任务,可以把这个任务分割为若干互不依赖的子任务,为了减少线程间的竞争,把这些子任务分别放到不同的队列里,并为每个队列创建一个单独的线程来执行队列里的任务,线程和队列一一对应。比如A线程负责处理A队列里的任务。但是,有的线程会先把自己队列里的任务干完,而其他线程对应的队列里还有任务等待处...

2018-12-11 10:27:47 4346 1

转载 Fork/Join框架。

本文将会介绍Fork/Join框架的基本原理、算法、设计方式、应用与实现等。什么是Fork/Join框架Fork/Join框架是Java 7 提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个任务结果后得到大任务结果的框架。我们再通过Fork/Join这两个单词来理解一下Fork/Join框架。Fork就是把一个大任务切分为若干子任务并行的执行,Join就...

2018-12-11 10:26:01 130

转载 并发:Java中的阻塞队列(BlockingQueue)。

本文将介绍什么是阻塞队列,以及Java中阻塞队列的4种处理方式,并介绍Java  7中提供的7种阻塞队列,最后分析阻塞队列的一种实现方式。什么是阻塞队列阻塞队列是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。...

2018-12-11 09:03:54 826

转载 并发:ConcurrentLinkedQueue(非阻塞的线程安全队列)。

在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,他采用先进先出的规则对节点进行排序,当...

2018-12-10 15:07:53 1559

转载 并发:ConcurrentHashMap的实现原理与使用。

ConcurrentHashMap是线程安全且高效的HashMap。本文让我们一起研究一下该容器是如何在保证线程安全的同时又能保证高效的操作。为什么要使用ConcurrentHashMap在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于以上两个原因,便有了ConcurrentHashMap的登场机会。线程不安全的HashMap...

2018-12-10 11:33:40 249

转载 并发:Condition接口。

任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object上),主要包括wait()、wait(long timeout)、notify()以及notifyAll()方法,这些方法与synchronized同步关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性...

2018-12-06 16:09:48 207

转载 等待/通知的经典范式。

该范式分为两部分,分别针对等待方(消费者)和通知方(生产者)。等待方遵循如下原则。获取对象的锁。 如果条件不满足,那么调用对象的wait()方法,被通知后仍要检查条件。 条件满足则执行对应的逻辑。对应的伪代码如下。synchronized(对象) { while(条件不满足) { 对象.wait(); } 对应的处理逻辑}通知方遵循...

2018-12-06 14:43:12 1414

转载 并发:LockSupport工具。

当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也成为构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及uppark(Thread thread)方法来唤醒一个被阻塞的线程。Park有停车的意思,假...

2018-12-06 13:50:42 278

转载 并发:读写锁(ReentrantReadWriteLock)。

ReentrantLock之类的基本都是排它锁,这些锁在同一时刻只允许一个线程进行访问,而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排它锁有了很大提升。除了保证写操作对读操作的可见性以及并发行的提升之外,读写锁能够简化读写交互场景的编程方式。假设在程序中定义一个共...

2018-12-06 11:29:04 1110

转载 并发:重入锁(ReentrantLock)。

重入锁,顾名思义,就是支持冲进入的锁,他表示该锁能够支持一个线程对资源的重复加锁。除此之外,该锁的还支持获取锁时的公平和非公平性选择。synchronized关键字隐式的支持重进入,比如一个synchronized修饰的递归方法,在方法执行时,执行线程在获取了锁之后仍能连续多次的获取该锁。ReentrantLock虽然没能像synchronized关键字一样支持隐式的重进入,但是在调用lo...

2018-12-05 17:20:42 433

转载 并发:队列同步器(AbstractQueuedSynchronizer)。

队列同步器(以下简称同步器),是用来构建锁和或者其他同步组件的基础框架,他使用了一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,并发包的作者期望他能够成为实现大部分同步需求的基础。同步器的主要使用方式是继承,子类通过继承同步器并实现他的抽象方法来管理同步状态,在抽象方法的实现过程中免不了要对同步状态进行更改,这时就需要使用同步器提供的3个方法(getStat...

2018-12-05 15:49:19 312

转载 并发:双重检查锁定(Double-Checked Locking)与延迟初始化(Lazy Initialization)。

在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但他是一个错误的用法。本文将分析双重检查锁定的错误根源,以及两种线程安全的延迟初始化方案。双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需...

2018-12-03 15:04:49 1339 1

elasticsearch技术培训

elasticsearch技术简单培训。用于在公司内部普及关于elasticserach技术,给大家一个入门的敲门砖。

2018-12-18

zookeeper示例代码。

zookeeper简单示例代码,包括对象、节点、通信协议、序列化、acl权限、curator应用、zkclient应用等。

2018-03-07

Solr技术培训资料(基础知识+高级应用)。

这是我整理的关于Solr的技术培训资料,它包含了关于Solr的基础知识和高级应用,例如分组、分词器、权重等问题,因为本人在学习solr时发现资源太少,所以整理了一些,当然由于本人技术不足,难免知识点不够全面,有疑问可以到我的博客上联系我,我会尽量在博客上更新相应的内容。

2017-11-16

空空如也

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

TA关注的人

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