![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
源码
wuaiqian
这个作者很懒,什么都没留下…
展开
-
guava缓存原理--get操作
V get(K key, CacheLoader<? super K, V> loader) throws ExecutionException { int hash = hash(checkNotNull(key)); //这里使用了分段的hash表,原理参考ConcurrentHashMap return segmentFor(hash).get(key, ...原创 2019-03-07 15:29:32 · 1301 阅读 · 0 评论 -
JDK源码--StringBuilder/StringBuffer(字符串操作)
StringBuilderappendpublic AbstractStringBuilder append(String str) { if (str == null) return appendNull(); int len = str.length(); ensureCapacityInternal(count + len); //开辟len长度的...原创 2019-03-21 19:36:42 · 237 阅读 · 0 评论 -
JDK源码-ReetrantReadWriteLock(可重入读写锁)
读锁加锁:没有线程持有锁,或者持有的都是读锁写锁加锁:没有线程持有锁写锁加锁public void lock() { sync.acquire(1);}public final void acquire(int arg) { if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.E...原创 2019-03-21 13:55:31 · 191 阅读 · 0 评论 -
JDK源码--ReetrantLock(可重入锁)
加锁时判断是否已加锁的为当前线程,如果是则加锁成功同时增加锁次数解锁时需要把加的锁次数扣减至0才算解锁成功分为公平和非公平锁加锁public void lock() { acquire(1);}protected final boolean tryAcquire(int acquires) { final Thread current = Thread.curren...原创 2019-03-21 11:56:24 · 392 阅读 · 0 评论 -
JDK源码--Semaphore(AQS子类)
Semaphore称为计数信号量,允许n个任务同时访问某资源,可将信号量看做是在向外分发使用资源的许可证,只有成功获取许可证才能使用资源。支持公平与非公平两种获取方式。初始化public Semaphore(int permits) { sync = new NonfairSync(permits);}public Semaphore(int permits, boolea...原创 2019-03-20 14:11:00 · 168 阅读 · 0 评论 -
JDK源码--ConcurrentSkipListMap(跳跃表)
原理Redis有序集合中使用,跟红黑树相同的时间效率,但实现更简单。读取数据private V doGet(Object key) { if (key == null) throw new NullPointerException(); Comparator<? super K> cmp = comparator; ...原创 2019-03-20 13:39:05 · 256 阅读 · 0 评论 -
JDK源码--CopyOnWriteArrayList(写时复制)
原理如果多个调用者同时要求相同资源,他们会获取相同的资源,直到某个调用者试图修改资源时,系统才会真正复制一份副本给该调用者,而其他调用者见到的最初资源仍然保持不变。这对其他调用者都是透明的。优点是如果调用者没有修改资源,就不会有副本创建,多个调用者读取操作可共享同一资源。典型的读写分离思想不足大并发写时会创建多个副本,浪费内存,频繁GC只能保证数据最终的一致性,不能保证数据的实时一...原创 2019-03-20 13:39:45 · 627 阅读 · 0 评论 -
JDK阻塞队列--ArrayBlockingQueue、LinkedBlockingQueue
ArrayBlockingQueue基本数据结构数组实现线程安全保证:ReentrantLocknotEmpty等待队列:获取数据的消费者线程被阻塞时放置到该队列notFull等待队列:插入数据的生产者线程被阻塞时放置到该队列插入数据public void put(E e) throws InterruptedException { checkNotNull(e); ...原创 2019-03-20 13:39:29 · 87 阅读 · 0 评论 -
JDK源码-线程池ThreadPoolExecutor
基本数据结构AtomicInteger ctl:前三位为线程池状态,后29位为活跃线程数目CAS–compareAndIncrementWorkerCount:活跃线程数增1(新增线程)阻塞队列–BlockingQueue workQueue:工作队列(需要被线程池执行的线程队列)可重入锁–ReentrantLock:添加工作线程等操作时的加锁HashSet workers:所有的工作...原创 2019-03-28 11:10:29 · 136 阅读 · 0 评论 -
guava缓存原理--listener
有时我们需要在缓存被移除时得到这个通知,并做一些额外处理。这时RemovalListener就派上用场了。RemovalListener<Integer, AtomicInteger> removalListener = new RemovalListener<Integer, AtomicInteger>() { //覆盖接口的onR...原创 2019-03-07 16:51:52 · 289 阅读 · 0 评论 -
JDK源码-PriorityBlockingQueue(优先阻塞队列)
数据结构//二叉平衡堆private transient Object[] queue;//外部操作加锁private final ReentrantLock lock;private final Condition notEmpty;//通过CAS获取的自旋锁private transient volatile int allocationSpinLock;初始化publi...原创 2019-03-22 15:54:59 · 163 阅读 · 0 评论