java源码
文章平均质量分 90
java源码解析
Pure_Eyes
这个作者很懒,什么都没留下…
展开
-
jdk8新特性汇总
文章目录1.Lambda2.增加时间工具类2.注解增强3.接口增强4.流式处理5.引入Optional6.引入Base647、增强方法引用8、并发9、引用增强1.Lambda2.增加时间工具类LocalDate/LocalTime 和 LocalDateTime几乎所有的时间对象都实现了 Temporal 接口,所以接口参数一般都是 TemporalInstant: 表示时间线上的一个点...原创 2020-04-06 18:04:23 · 247 阅读 · 0 评论 -
java典型工具类特征
基础集合:ArrayList: 数组结构,容量最高Integer.MAX_VALUE,初始默认容量10,每次扩容1.5倍LinkedList:链表结构,无限队列HashMap:数组+链表(8+红黑树),初始默认容量16,上限1<<30,负载因子0.75,每次扩容2倍基础拓展集合:HashSet: 内部靠将值设置为HashMap的key值来进行去重LinkedHashMap:...原创 2020-04-06 16:13:53 · 473 阅读 · 0 评论 -
synchronized原理探究
synchronized属于java的元老级锁,做并发变成几乎绕不开。synchronized通常会与Reentrant做比较,synchronized属于jvm层面实现的锁,要理解必须知道其底层意义。synchronized 对java对象进行加锁,在jvm中,对象可分为三个部分,对象头、实例数据、对齐填充。对象头:Hotspot对象头主要分为两部分,标记字段(mark word)与类型指...原创 2020-04-05 22:10:42 · 137 阅读 · 0 评论 -
java LinkedList
LinkedList经常与ArrayList进行比较,一般来说随机读远高于修改次数时一般使用ArrayList,而频繁删减元素时则使用LinkedList。ArrayList底层是数组实现的,因此随机读效率很高,但删除元素时的集体前移过程会极大消耗资源,添加元素时的扩容操作也会集体前移元素到新数组上,因此不适合频繁修改LinkedList底层是链表结构,修改元素时只需添加节点或者删除节点,涉及...原创 2019-08-22 11:15:13 · 164 阅读 · 0 评论 -
ArrayList存储及扩容机制
主要成员变量 //默认数组大小 private static final int DEFAULT_CAPACITY = 10; // 当ArrayList的构造方法中显示指出ArrayList的数组长度为0时,类内部将EMPTY_ELEMENTDATA 这个空对象数组赋给elemetData数组 private static final Object[] EMPTY_ELEME...原创 2019-08-21 16:28:11 · 546 阅读 · 0 评论 -
java CountDownLatch
并发编程中经常出现的一种场景是多个线程执行完毕后才能执行一个操作,此时用Lock锁与wait/notify会复杂很多。jdk提供的CountDownLatch相当于一个倒计时器,可以等待多个线程运行到某个点上后再进行下一步public class Demo { public static void main(String[] args) throws InterruptedException ...原创 2019-08-20 14:11:20 · 156 阅读 · 0 评论 -
java CyclicBarrier
CyclicBarrier是jdk提供的用来控制线程数量工具,相当于一个线程栅栏,当线程数量达到一定数量时才允许向下运行构造方法:public CyclicBarrier(int parties)/*** parties 线程数量* barrierAction 线程冲破后的回调*/public CyclicBarrier(int parties, Runnable barrierA...原创 2019-08-20 11:20:18 · 126 阅读 · 0 评论 -
java Semaphore
Semaphore是jdk用以控制线程并发数的工具,主要以acquire()与release()成对使用acquire 获取运行令牌,没有则阻塞当前线程直到获取到release 释放令牌public class Demo { public static void main(String[] args) { Semaphore se = new Semaphore(2); List&...原创 2019-08-20 10:44:18 · 108 阅读 · 0 评论 -
java Exchanger
java.util.concurrent.Exchanger 是jdk提供的一个线程通信工具,用以两个线程交换信息,它是阻塞型的,直到两个线程同时运行到交换信息处并且交换完成后才会继续运行,如下:public class Demo { public static void main(String[] args) throws NoSuchFieldException, SecurityExc...原创 2019-08-20 10:29:42 · 123 阅读 · 0 评论 -
java AbstractQueuedSynchronizer探索
AbstractQueuedSynchronizer是jdk中绝大部分Lock接口实现类的一个基础抽象类,它依赖的类很少,再往深里挖也只剩下Unsafe类了,虽然本身代码量也不是很多,但足以称得起AQS框架的大名,像ReentrantLock、CountDownLatch等这类易用的工具类都是对AbstractQueuedSynchronizer进行了简单的封装,因此想要学好java并发充分理解A...原创 2019-08-14 15:47:38 · 115 阅读 · 0 评论 -
LockSupport 类探索
java的LockSuopport类是一个基础工具类,多用来构建并发工具锁时使用,它的方法不多,由下图可知它的方法都是静态的,并且代码量很小,每个方法只有几行,基本都是使用的sun.misc.Unsafe来实现的,而Unsafe是一个jdk未公开的类,LockSupport算是绕过了代码权限供开发人员安全使用Unsafe的一个代替工具LockSuopport在构建其他锁的类时经常使用的方法是p...原创 2019-08-14 15:26:40 · 107 阅读 · 0 评论 -
java UnSafe类探索
UnSafe在jdk8以及之前是一个未公开类,jdk9后开始公开使用,对此我们不做过多探讨。java并发工具中底层广泛使用了UnSafe,经常使用的方法是compareAndSwapInt,compareAndSwapLong,这两个方法都使用了CAS算法...原创 2019-08-14 15:15:09 · 259 阅读 · 0 评论 -
java源码系列
集合(经典集合类)一、CollectionListArrayListLinkedArrayListSetHashSetLinkedHashSetTreeSetMapHashMapTreeMapHashTableHashSetJUC系列A、锁UnSafeLockSupportAbstractQueuedSynchronizerReentra...原创 2019-08-14 14:44:28 · 832 阅读 · 0 评论 -
SynchronousQueue
文章目录成员变量内部类构造函数插入元素获取元素成员变量 /** The number of CPUs, for spin control */ static final int NCPUS = Runtime.getRuntime().availableProcessors(); /** * 定时等待中旋转的此时,经验上cpu超过2个性能便不会变化,所以是一个常数...原创 2019-09-02 16:52:11 · 126 阅读 · 0 评论 -
ConcurrentHashMap(jdk7)
ConcurrentHashMap的UML结构如下数据结构如下ConcurrentHashMap内部维持一个Segment数组,存储一组锁,每个锁里面含有一个HashEntry数组,存取数据时先经过哈希算法判断出属于哪个锁管理,拿到锁后就进入了数据区,HashEntry对象是一个链表节点,相当于每个锁管理一个HashMap对象,由于此时操作都有锁保护,故ConcurrentHashMap相...原创 2019-08-27 17:27:47 · 236 阅读 · 0 评论 -
ArrayBlockingQueue
ArrayBlockingQueue作为一个线程安全阻塞式的集合队列,更底层角度上看更像是一个线程安全的数组,因为像ArrayList这种集合是可以动态扩容的,但ArrayBlockingQueue的数组大小是固定的,在构造器里面便已设置好数组大小,所以性能瓶颈更多受限于全局锁的局限。先看下里面的成员变量 //存放元素的数组 final Object[] items; /*...原创 2019-08-30 17:57:33 · 1293 阅读 · 0 评论 -
ReentrantLock
ReentrantLock与synchronized齐名的经典java锁,十分常用。ReentrantLock特性:可重入可通过构造参数设置时公平锁还是非公平锁需要明文释放锁,而synchronized是自动释放的...原创 2019-09-03 09:32:22 · 3172 阅读 · 0 评论 -
CopyOnWriteArraySet
CopyOnWriteArraySet相对CopyOnWriteArrayList用来存储不重复的对象,是线程安全的。虽然继承了AbstractSet类,但CopyOnWriteArraySet与HashMap 完全不同,内部是用CopyOnWriteArrayList实现的,实现不重复的特性也是直接调用CopyOnWriteArrayList的方法实现的,感觉加的最有用的函数就是eq函数判断对象...原创 2019-09-02 21:49:03 · 2117 阅读 · 0 评论 -
CopyOnWriteArrayList
CopyOnWriteArrayList是一个线程安全的集合类,本身没有父类,直接实现了4个接口List, RandomAccess, Cloneable, java.io.SerializableCopyOnWriteArrayList功能上与ArrayList类似,结构上也是内部维系一个Object数组,调用add方法时会动态扩容。两者区别是CopyOnWriteArrayList的数组每次...原创 2019-09-02 18:25:08 · 235 阅读 · 0 评论 -
AtomicStampedReference
AtomicInteger、AtomicLong等这类Atomic类都不能避免ABA问题,但项目中经常需要避免这类问题,此时可采用AtomicStampedReference进行辅助开发。AtomicStampedReference内部本身不能避免ABA,但它通过设置版本号,每次设置完成后对版本号进行比对,以此验证更新是否正确,不正确则重试AtomicStampedReference是一个泛型类...原创 2019-09-02 17:34:39 · 281 阅读 · 0 评论 -
AtomicBoolean
AtomicBoolean相对AtomicInteger逻辑更简单一些,但内部仍然是用一个int型数字表示true/false状态而不是boolean变量,源码如下成员变量 private static final Unsafe unsafe = Unsafe.getUnsafe(); private static final long valueOffset; static...原创 2019-09-02 17:12:57 · 166 阅读 · 0 评论 -
AtomicInteger
AtomicInteger作为一个线程安全类,在多线程环境下做计数器是一个很好的选择AtomicInteger的线程可见性靠volatile关键字保证,递增或者递减的顺序性靠jdk的Unsafe类来实现成员变量 private static final Unsafe unsafe = Unsafe.getUnsafe(); //对象偏移量 private static fina...原创 2019-09-02 17:05:18 · 210 阅读 · 0 评论 -
LinkedBlockingQueue
相比ArrayBlockingQueue,LinkedBlockingQueue使用链表结构实现阻塞队列,使用的辅助类更多一些,一般说是无界队列,实际上也是有界的,只不过上限是int类型的最大值而已,也就是40多亿,一般达不到这个数量,在达到之前估计计算机内存就爆了。只不过ArrayBlockingQueue初始化的时候已经初始化好了数组,因此内存也分配好了,而链表是动态增减的,内存使用率更好一些...原创 2019-08-30 18:20:13 · 446 阅读 · 0 评论