jdk
文章平均质量分 82
tydhot
gogogo
展开
-
caffeine 弱引用key的实现
Caffeine底层的存储容器还是ConcurrentHashMap,如果需要存储的key是一个弱引用,如果直接把key存储到ConcurrentHashMap中时 ,将无可避免的导致一个强引用出现,导致弱引用key的目的失败。当在构造caffeine的时候如果选择了弱引用的key,最后保存到ConcurrentHashMap中的key将不再是put()时候的key,而是一个封装的弱引用对象WeakReference,保证map中对key的强引用实际指向的是封装的对象引用,缓存中真正指向key的还是一个原创 2020-05-29 00:05:00 · 1414 阅读 · 1 评论 -
threadlocal的set()方法中的内存回收
ThreadLocal在执行set()方法的时候,实际执行set()逻辑的是其内部类ThreadLocalMap。private void set(ThreadLocal<?> key, Object value) { Entry[] tab = table; int len = tab.length; int i = key.threadLocalHa...原创 2020-05-02 01:25:42 · 1573 阅读 · 0 评论 -
Arrays.asList()的坑
Arrays.asList()产生的ArrayList并不是集合包下的的ArrayList,而是实现在Arrays类中的内部类ArrayList,该类并未重写remove()方法,因此Arrays.asList()产生的ArrayList一旦调用remove()方法将会报错。如果要调用remove(),可以如下new ArrayList<>(Arrays.asList(...原创 2020-03-08 01:30:16 · 259 阅读 · 0 评论 -
ScheduledThreadPoolExecutor定时任务线程池
ScheduledThreadPoolExecutor的schedule()方法可以将线程任务在一段时间后定时触发,并在一段时间后反复定时触发。在ScheduledThreadPoolExecutor,定时任务都会被包装成一个ScheduledFutureTask,以下是其构造方法。ScheduledFutureTask(Runnable r, V result, long ns, lo...原创 2019-11-04 01:26:37 · 679 阅读 · 0 评论 -
ReentrantLock类源码解析
先看ReentrantLock类的构造方法和成员 private final Sync sync;public ReentrantLock() { sync = new NonfairSync();}public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new Nonfair...原创 2017-09-26 22:08:06 · 330 阅读 · 0 评论 -
Java中的阻塞队列
我们先来看ArrayBlockingQueue类先看作者给出的注释* A bounded {@linkplain BlockingQueue blocking queue} backed by an* array. This queue orders elements FIFO (first-in-first-out). The* <em>head</em> o...原创 2017-09-25 18:16:46 · 277 阅读 · 0 评论 -
Java线程池execute()方法源码解析
先看作者给出的注释来理解线程池到底有什么作用* Thread pools address two different problems: they usually* provide improved performance when executing large numbers of* asynchronous tasks, due to reduced per-task invocatio...原创 2017-09-23 12:41:15 · 19326 阅读 · 0 评论 -
CopyOnWriteArrayList原理及算法题存档
CopyOnWriteArrayList是通过在添加元素的时候复制一份副本,再在其基础上添加完新的元素之后,在将新的数组作为CopyOnWriteArrayList所保存的数组来达到线程安全。其add()方法如下:public boolean add(E e) { final ReentrantLock lock = this.lock; lock.lock(); ...原创 2019-05-15 01:02:15 · 103 阅读 · 0 评论 -
jdk8 Arrays.sort()实现分析
Arrays.sort()根据所需要排序的数组的特点会选择不同的排序算法。第一种情况,当被排序的数组长度小于47并且排序是从数组起始位置开始的时候,采用的排序方式是最简单的插入排序。for (int i = left, j = i; i < right; j = ++i) { int ai = a[i + 1]; while (ai < a[j]) {...原创 2019-07-11 01:08:01 · 654 阅读 · 0 评论 -
Java1.8HashMap一段注释的解释
/** * Computes key.hashCode() and spreads (XORs) higher bits of hash * to lower. Because the table uses power-of-two masking, sets of * hashes that vary only in bits above the current mask will ...原创 2019-09-28 20:06:58 · 554 阅读 · 1 评论 -
Java1.7ConcurrentHashMap类源码解析
先来看ConcurrentHashMap类的成员。static final int DEFAULT_INITIAL_CAPACITY = 16;static final float DEFAULT_LOAD_FACTOR = 0.75f;static final int DEFAULT_CONCURRENCY_LEVEL = 16;static final int MAXI...原创 2017-09-27 19:31:35 · 442 阅读 · 1 评论 -
FutureTask源码解析
Java线程池中,需要实现带有返回值的线程任务接口需要实现Callable接口,在线程池ThreadPoolExecutor中采用submit()方法返回得到线程与返回值的容器FutureTask,用以完成对该线程的各种操作。 ThreadPoolExecutor继承自AbstractExecutorService,而具体的submit()方法实现就在AbstractExecutorSer...原创 2017-10-04 22:13:16 · 348 阅读 · 0 评论 -
jdk的ServiceLoader
ServiceLoader是jdk提供动态加载类的一种方式。可以使得用户能够在运行时动态解析目标文件夹下接口配置文件来动态加载相关类使得直接可以在运行时直接保证相关类的加载在jdk的nio包下SelectorProvider给出来相应的使用方式。 private static boolean loadProviderAsService() { ServiceLoader&l...原创 2018-01-07 02:22:11 · 794 阅读 · 0 评论 -
java8的stream流操作的数据结构
在java8的流操作中分为终止符和非终止符。非终止符不会触发数据的处理。每次通过stream()方法新建立一个流的时候都会创建一个Head类。这个类是ReferencePipeline的一个内部类,同时也继承了ReferencePipeline,代表当前流的一个初始状态。之后每进行一次中间操作,都会根据操作的类型生成一个StatelessOp或者StatefulOp代表有无状态的中间操作,...原创 2018-10-06 02:28:10 · 1163 阅读 · 0 评论 -
java8中stream中的任务拆分
在java8中流操作中,只有到终止符才会进行真正的求值。在设定了并行操作的时候,会对任务进行分解。任务的分解用到了joinfork框架。@Overridepublic void compute() { Spliterator<P_IN> rs = spliterator, ls; // right, left spliterators long sizeEs...原创 2018-10-04 17:50:00 · 1856 阅读 · 3 评论 -
java8的spliterator
Java8中容器在创建一个stream()流的过程中首先会创建一个相应的spliterator来作为迭代器来使用,这个迭代器支持并行迭代。根据每个容器不同的性质,这个迭代器也对应了相应的特征量。例如ArrayList。public int characteristics() { return Spliterator.ORDERED | Spliterator.SIZED | ...原创 2018-10-02 01:48:54 · 1192 阅读 · 0 评论 -
BufferedInputStream的read()方法源码解析
BufferedInputSream默认是现实给出了一个8192byte大小的数组。private static int DEFAULT_BUFFER_SIZE = 8192;public BufferedInputStream(InputStream in) { this(in, DEFAULT_BUFFER_SIZE);}public BufferedInputStre...原创 2018-08-30 00:44:05 · 3710 阅读 · 1 评论 -
jdk读写锁ReentrantReadWriteLock
public ReentrantReadWriteLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); readerLock = new ReadLock(this); writerLock = new WriteLock(this);} 构造方法中会生成读锁和写锁。 ...原创 2018-06-19 02:09:11 · 227 阅读 · 0 评论 -
jdk1.8 ConcurrentHashMap
在jdk1.8的ConcurrentHashMap的实现中,在其构造方法中主要是对内部的大小进行设置。public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) { if (!(loadFactor > 0.0f) |...原创 2018-02-22 04:58:19 · 394 阅读 · 0 评论 -
jdk的Selector(3)select的过程
当调用了SelectorImpl的select()方法的时候,同时会将所带的参数,也就是给select()所设置的timeout,之后会调用lockAndDoSelect(),在这个方法中,主要还是调用了doSelect()方法,参数与传进来的一致。以WindowsSelectorImpl为例子,实现的deSelect()方法。protected int doSelect(long var1...原创 2018-01-15 23:54:51 · 503 阅读 · 0 评论 -
jdk的selector(2)channel的注册
Selector中的channel注册需要由SelectabelChannel调用其register()方法开始注册流程。具体的register()方法实现在了AbstractSelectableChannel中。public final SelectionKey register(Selector sel, int ops, ...原创 2018-01-14 15:22:45 · 889 阅读 · 0 评论 -
jdk的selector(1)
在java中如过需要用到Selector来处理Nio的情况下,需要先使用SelectorProvider的provider()方法来取得相应的SelectorProvider。 public static SelectorProvider provider() { synchronized (lock) { if (provider != null) ...原创 2018-01-14 00:40:27 · 269 阅读 · 0 评论 -
ForkJoinPool 偷任务
ForkJoinPool中的工作线程ForkJoinWorkerThread的run()方法是这样的。public void run() { if (workQueue.array == null) { // only run once Throwable exception = null; try { onStart(); ...原创 2018-11-08 00:14:28 · 670 阅读 · 0 评论