jdk源码解析
文章平均质量分 80
jdk源码解析
Nuan_Feng
蓝桥杯国赛一等奖。唯有志存千里,方能风行天下。
展开
-
ConcurrentHashMap源码解析(看这一篇就够了,超简约且详细)
作者 Doug Lea 本身对这个问题有过回答,在并发编程中,null 值容易引来歧义, 假如先调用 get(key) 返回的结果是 null,那么我们无法确认是因为当时这个 key 对应的 value 本身放的就是 null,还是说这个 key 值根本不存在,这会引起歧义,如果在非并发编程中,可以进一步通过调用 containsKey 方法来进行判断,但是并发编程中无法保证两个方法之间没有其他线程来修改 key 值,所以就直接禁止了 null 值的存在。返回的时候n+1,有返回了当前值。原创 2023-02-11 18:11:06 · 897 阅读 · 0 评论 -
jdk源码解析八之NIO(selector)
这里写自定义目录标题示例代码register示例代码ServerSocketChannel serverChannel = ServerSocketChannel.open(); ServerSocket serverSocket = serverChannel.socket(); Selector selector = Selector.open(); serverSocket.bind (new InetSocketAddress (port)); serverChannel.con原创 2020-08-14 14:50:55 · 170 阅读 · 0 评论 -
jdk源码解析八之NIO(socketChannel)
ServerSocketChannel ServerSocketChannelImpl(SelectorProvider sp) throws IOException { super(sp); //创建FileDescriptor this.fd = Net.serverSocket(true); //获取到文件描述符的值。 this.fdVal = IOUtil.fdVal(fd); //标记状态为使用原创 2020-08-14 14:51:26 · 354 阅读 · 0 评论 -
jdk源码解析八之RPC实现(包含序列化源码解析)
package org.example.io;import java.io.Serializable;//类通过实现 java.io.Serializable 接口以启用其序列化功能。public class Person implements Serializable { //通过id来判断类是否改变 private static final long serialVersionUID = 3; private transient String name; //原创 2020-07-03 16:51:19 · 310 阅读 · 0 评论 -
jdk源码解析八之Piped管道流
文章目录demoPipedInputStreamPipedOutputStreamdemopackage io;import java.io.IOException;import java.io.PipedInputStream;import java.io.PipedOutputStream;/** * Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力。所以管道也可以作为数据源以及目标媒介 * * DataInputStream 读取的数据由大于一个字节的Jav原创 2020-07-02 11:33:40 · 260 阅读 · 0 评论 -
jdk源码解析二之HashMap
这里写自定义目录标题HashMapputremovereplaceget扩容resize迭代器总结什么时候采用红黑树?为什么每次扩容后,是2的幂次方?为什么扩容后,相同的在原位置保存,而不同的则当前索引+之前原位置索引保存?为啥用尾插法?为什么线程不安全?HashMapHashMap的loadFactor为什么是0.75?主要涉及到泊松分布的概念,猝!!!一个bucket空和非空的概率为0.5,通过牛顿二项式等数学计算,得到这个loadfactor的值为log(2),约等于0.693. 同回答者所说原创 2020-07-01 20:13:17 · 166 阅读 · 0 评论 -
jdk源码解析八之NIO
这里写自定义目录标题吃饭去咯原创 2020-07-01 20:08:42 · 359 阅读 · 0 评论 -
jdk源码解析八之BIO
文章目录字节流InputStreamFileInputStreamBufferInputStreamOutputStreamFileOutputStreamBufferOutputStream字符流ReaderFileReaderBufferReaderWriterFileWriterBufferWriter转换流InputStreamReaderOutputStreamWriter字节流InputStreamFileInputStreamBufferInputStreamOutputStrea原创 2020-07-01 11:06:14 · 192 阅读 · 0 评论 -
jdk源码解析七之Condition
文章目录ConditionnewConditionawaitsignalsignalAll总结Condition主要看java.util.concurrent.locks.AbstractQueuedSynchronizer.ConditionObjectnewCondition public Condition newCondition() { return sync.newCondition(); } final ConditionObject n原创 2020-06-30 11:20:59 · 369 阅读 · 0 评论 -
jdk源码解析七之ReadWriteLock
文章目录ReadWriteLockReentrantReadWriteLock构造获取读写锁读锁lockunlock写锁lockunlock锁降级总结ReadWriteLock分别维护2个锁,写锁是独占锁,读锁是共享锁,因为读的时间通常比写的时间长,所以写锁优先级比读锁高ReentrantReadWriteLock构造 public ReentrantReadWriteLock() { //默认独占 this(false); } publ原创 2020-06-30 11:19:02 · 271 阅读 · 0 评论 -
jdk源码解析七之ReentrantLock
文章目录ReentrantLock构造lockunlocktryLocknewCondition非公平策略获取锁总结非公平和公平获取锁的区别?ReentrantLock一个可重入的互斥锁 Lock构造 public ReentrantLock() { //默认初始化非公平的AQS sync = new NonfairSync(); } public ReentrantLock(boolean fair) { //根据传入的值原创 2020-06-30 11:16:29 · 193 阅读 · 1 评论 -
jdk源码解析五之Thread
这里写自定义目录标题Thread构造startinterruptjoinStaterun总结ThreadFactoryDefaultThreadFactoryThread构造 private void init(ThreadGroup g, Runnable target, String name, long stackSize, AccessControlContext acc, boolean inherit原创 2020-06-27 14:09:16 · 201 阅读 · 0 评论 -
jdk源码解析四之CyclicBarrier
文章目录CyclicBarrierawaitresetCyclicBarrier阻塞一组线程直到某件事发生,可重复使用,另一种栅栏式。5个人约好集合后去其他地方。 public CyclicBarrier(int parties, Runnable barrierAction) { if (parties <= 0) throw new IllegalArgumentException(); //屏障拦截的线程数量 this.parties原创 2020-06-26 17:12:12 · 149 阅读 · 0 评论 -
jdk源码解析四之Semaphore
文章目录Semaphoreacquirerelease总结Semaphore计数信号量:控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量,实现某种资源池,对容器施加边界acquire步骤同CountDownLatch.wait public void acquire() throws InterruptedException { sync.acquireSharedInterruptibly(1); } protected int原创 2020-06-26 17:11:35 · 132 阅读 · 0 评论 -
jdk源码解析四之FutureTask
文章目录FutureTask构造带返回构造rungetcancelfinishCompletion总结FutureTask提前加载稍后需要的数据Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。Callable返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。 /** * The run state of this原创 2020-06-26 17:11:03 · 273 阅读 · 0 评论 -
jdk源码解析四之CountDownLatch
文章目录CountDownLatchawaitcountDowncancelAcquire总结CountDownLatch可用于实现闭锁操作,延迟线程的进度直到其到达终止状态。确保某些活动直到其它活动都完成后才继续运行,只开启一次。发令枪响后,所有运动员跑步 //这个节点由于超时或中断被取消了。节点不会离开(改变)这个状态。尤其,一个被取消的线程不再会被阻塞了 static final int CANCELLED = 1; /** waitStatus原创 2020-06-26 17:10:30 · 221 阅读 · 0 评论 -
jdk源码解析三之ThreadLocal
文章目录ThreadLocalset初始化ThreadLocalMapset赋值重新使用失效节点清空无效节点扩容getremove总结ThreadLocalset public void set(T value) { //当前线程的.ThreadLocalMap绑定了当前ThreadLocal对象和value //获取当前线程 Thread t = Thread.currentThread(); //获取与当前线程绑定的map,这里原创 2020-06-26 17:07:15 · 237 阅读 · 0 评论 -
jdk源码解析三之ArrayBlockingQueue
文章目录ArrayBlockingQueueputoffertakeremove总结ArrayBlockingQueue public ArrayBlockingQueue(int capacity, boolean fair) { if (capacity <= 0) throw new IllegalArgumentException(); this.items = new Object[capacity]; //一原创 2020-06-26 17:01:46 · 191 阅读 · 0 评论 -
jdk源码解析三之LinkedBlockingQueue
文章目录LinkedBlockingQueueputoffer阻塞时间的offertakepollpeekremove迭代器总结LinkedBlockingQueue一个基于链表的阻塞队列。此队列按 FIFO(先进先出)排序元素 public LinkedBlockingQueue() { //默认最大容量 this(Integer.MAX_VALUE); } public LinkedBlockingQueue(int capacity) {原创 2020-06-26 17:01:08 · 116 阅读 · 0 评论 -
jdk源码解析三之CopyOnWriteArrayList
文章目录CopyOnWriteArrayListaddremovegetset总结CopyOnWriteArrayList写入时复制,只要正确发布一个事实不可变对象,在访问该对象时就不再需要进一步同步,在每次修改时,都会创建并重新发布一个新的容器副本,从而实现可变性.使用场景:迭代>修改,事件通知系统(注册和注销事件监听器操作少于接收事件通知的操作) //构造时,初始化容量为0的Object数组 public CopyOnWriteArrayList() { set原创 2020-06-26 17:00:26 · 111 阅读 · 0 评论 -
jdk源码解析三之ConcurrentHashMap
文章目录ConcurrentHashMapput初始化扩容getreplace#remove总结:ConcurrentHashMap //使用了unSafe方法,通过直接操作内存的方式来保证并发处理的安全性,使用的是硬件的安全机制。 /* * 用来返回节点数组的指定位置的节点的原子操作 */ static final <K,V> Node<K,V> tabAt(Node<K,V>[] tab, int i) { r原创 2020-06-26 16:59:27 · 274 阅读 · 0 评论 -
jdk源码解析六之native
如何查看本地方法?拿Thread.currentThread作为例子可见在jdk源码中调用的是本地方法对应的包名是java.lang,在jdk源码中根据对应的路径名查找到Thread.c这2个头分别在openjdk\jdk\src\share\javavm\export目录不知道什么鬼.有时间了解JNI在去仔细琢磨这个玩意儿....原创 2020-06-04 16:24:09 · 180 阅读 · 0 评论 -
jdk源码解析七之Lock
锁同步锁,是可重入锁,这样当访问本类或者超类其他加锁方法时,也能访问成功,从而避免死锁加锁,可保证互斥,内存可见性,避免重排序 3种方式 1:减少锁持有时间 H_AttributeStore/I_BetterAttributeStore 由于只有一个状态变量,可以使用其他容器类,如SyncMap/ConcurrentHashMap,这样无需显示同步,缩小了访问锁的范围,降低了代码维.原创 2020-06-04 12:07:37 · 390 阅读 · 1 评论 -
jdk源码解析五之Executor框架(ThreadPoolExecutor,Thread,ScheduledExecutorService)
线程池锁同步锁,是可重入锁,这样当访问本类或者超类其他加锁方法时,也能访问成功,从而避免死锁加锁,可保证互斥,内存可见性,避免重排序原创 2020-05-27 18:58:16 · 493 阅读 · 0 评论 -
jdk源码解析四之AQS框架(闭锁,栅栏,信号量等)
线程池锁同步锁,是可重入锁,这样当访问本类或者超类其他加锁方法时,也能访问成功,从而避免死锁加锁,可保证互斥,内存可见性,避免重排序原创 2020-05-27 13:16:19 · 369 阅读 · 0 评论 -
jdk源码解析三之JUC并发容器
本篇文章主要是对JUC包下,一些并发类的源码分析,如果想了解具体实例,请点击原子类数据结构ConcurrentHashMapputIfAbsent //没key则添加 V putIfAbsent(K key, V value);removekey映射为value,则移除replacekey对应value为oldValue则更新为newValuereplacekey映射有值,则更新没有实现对map进行加锁来执行独占访问,因为采用了分段锁,所以无法使用客户端加锁来创建原创 2020-05-26 12:41:25 · 732 阅读 · 0 评论 -
jdk源码解析二之Map
MapHashMapHashMap的loadFactor为什么是0.75?主要涉及到泊松分布的概念,猝!!!一个bucket空和非空的概率为0.5,通过牛顿二项式等数学计算,得到这个loadfactor的值为log(2),约等于0.693. 同回答者所说,可能小于0.75 大于等于log(2)的factor都能提供更好的性能,0.75这个数说不定是 pulled out of a hat。put public V put(K key, V value) { return原创 2020-05-25 13:54:26 · 381 阅读 · 0 评论 -
jdk源码解析一之Collection
Collection架构ListArrayListcloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常。Object中clone方法: protected native Object clone() throws CloneNotSupportedException;具体点击此博客Rand原创 2020-05-24 17:29:29 · 376 阅读 · 0 评论