![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JDK
wuaiqian
这个作者很懒,什么都没留下…
展开
-
Collections集合接口
HashMap:数组+单链表维持哈希表,冲突节点头插 LinkedHashMap:继承HashMap,双链表维持哈希表,可保证数据的有序性,冲突节点尾插 ConcurrentHashMap TreeMap:红黑树,支持排序的map,相对于HashMap PriorityQueue:优先队列,内部是一个最小堆,根节点最小 WeakHashMap(常用于缓存):使用同HashMap,不过WeakH...原创 2019-03-04 10:16:05 · 442 阅读 · 0 评论 -
JDK源码--StringBuilder/StringBuffer(字符串操作)
StringBuilder append public 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源码--CountDownLatch(AQS子类)
CountDownLatch用于同步一或多个线程,强制它们等待由其他线程执行的一组操作完成。典型用法是将一个程序分为n个互相独立的可解决任务,并创建值为n的CountDownLatch。每个任务完成时都会调用countDown,等待问题被解决的任务调用await将自己挂起,直至计数结束。 初始化 public CountDownLatch(int count) { //参数为等待完成的线程数 ...原创 2019-03-20 13:59:36 · 162 阅读 · 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 基本数据结构 数组实现 线程安全保证:ReentrantLock notEmpty等待队列:获取数据的消费者线程被阻塞时放置到该队列 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 评论 -
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 评论