3 weixin_yangyang

尚未进行身份认证

我要认证

大班程序员

等级
TA的排名 43w+

ReetrantLock源码解析

一.首先解析lock方法,lock方法调用了aqs的acquire方法,所以直接看acquire方法。//lock方法调用public final void acquire(int arg) { //加锁失败会将当前线程封装成Node添加到链表并挂起 if (!this.tryAcquire(arg) && this.acquireQueued(this.addWaiter(AbstractQueuedSynchronizer.Node.EXCLUSIVE), arg))

2020-07-01 19:36:49

双向链表查询流程图所有的线路

双向链表查询流程图所有的线路import java.util.*;/** * @description: * 双向链表遍历流程图所有的线路 * @see:com.rongda.es.util * @author:丁金阳 * @createTime:2020-06-18 13:06 */public class TreeRoutes { /** * 单线程 仅用于测试 */ static Node root = new Node("root");

2020-06-18 18:22:04

Mybatis执行流程原理解析

mybatis原理:1.首先加载mybatis全局配置文件。InputStream inputStream=Resources.getResourceAsStream(“mybatis.xml”);2.解析配置文件生成Configuration,并根据Configuration生成SqlSessionFactory。主要包含对别名,setting以及mapper等的解析。SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder

2020-06-03 11:08:31

链表和ReetrantLock实现哲学家就餐问题

import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.ReentrantLock;/**@description:五个哲学家就餐问题五个哲学家相当于五个线程,五个叉子相当于五把锁。每个哲学家必须持有相邻的两把锁,才能吃面(使用链表和reentrantLock实现)@see:com.rongda.mybatispersonal@author:丁金阳@createTime:202

2020-05-21 14:23:31

双向指针将数组划分为n部分

/** * @description: * 如果可以找出索引 i+1 < j 且满足 * (A[0] + A[1] + ... + A[i] == A[i+1] + A[i+2] + ... + A[j-1] == A[j] + A[j-1] + ... + A[A.length - 1]) 就可以将数组三等分。 * * 拓展为划分为 n部分 * @see:com.rongda.mybatispersonal.juc * @author:丁金阳 * @createTime:202.

2020-05-22 14:49:03

jdk1.8 ConcurrentHashMap 详细解析

解析比较干吧,可能看起来比较枯燥,哈哈。建议先自行看上几遍源码再来看。put方法 /** * 1.第一次put进行初始化操作 * 2.否则数组单元为空,通过cas操作新建node节点并设置到数组单元,cas保证只有一个线程设置成功,不成功的继续自旋生成链表/树 * 3.如果数组正在扩容,则帮助其进行扩容 * 4.如果数组单元不为空,则生成链表/树 * * 最后进行count++操作,

2020-05-09 14:50:17

jdk1.8 ThreadLocalMap解析

ThreadLocal区别于加锁的方式,为每一个线程创建一个ThreadLocalMap,实现了线程安全。这样做的好处是让线程自身去维护各自的map,生命周期随着线程销毁而销毁。 private void set(ThreadLocal<?> key, Object value) { // We don't use a fast path as...

2020-04-30 16:57:56

jdk1.8 ThreadPoolExecutor深入解析,Doug Lea如何实现真正的多线程编程

execute方法 public void execute(Runnable command) { if (command == null) throw new NullPointerException(); //ctl高三位表示线程池状态,低29位表示线程数量 int c = ...

2020-04-29 09:31:14

jdk1.8 探讨FutureTask的两个问题

1.FutureTask任务多线程并发访问时为啥只会被执行一次? public void run() { //如果state==new 说明任务没有被执行或者正在被执行还没有执行到set(result)方法。 //此时通过CAS操作将runner设置为当前线程,这样如果线程正在执行(此时state仍然为 new)其他线程进来后CAS设置失败,直接return。这就是为...

2020-04-13 16:42:31

自己实现Double.valueOf()

闲着没事,自己实现了一下Double.valueOf(),不能和官方比。会存在精度缺失问题。 /** * 字符串转double * @param source * @return */ public static double parseDoubleValue(String source){ if(source==null){...

2020-04-04 19:28:21

自己实现String的replace字符串替换方法

最近想看一下String的replace字符串替换源码,无奈自己水平有限,没看明白。所以本人花了一天时间自己写了一个,算法时间复杂度位O(m*n)。 /** * 字符串替换函数 * @param source 源字符串 * @param oldCharSequence 被替换的字符串 * @param newCharSequence 替换的字符串...

2020-04-03 12:05:36

jdk1.8 详细解析HashMap 源码

putVal(int var1, K var2, V var3, boolean var4, boolean var5)存放方法 var1为计算好的索引值,var2 键 var3值 final V putVal(int var1, K var2, V var3, boolean var4, boolean var5) { HashMap.Node[] var6;...

2020-03-31 16:14:51

jdk1.8 LinkedBlockingQueue的put和offer方法解析

1.两个常用构造方法不指定大小默认int最大范围。2.put(E var1)if (var9 == 0) {this.signalNotEmpty()} put元素之前如果队列为空(take线程有可能全部等待),就叫醒一个take线程。为什么不是每次put元素之后都叫醒take线程,因为这样做会造成不必要的锁资源竞争。另外put线程只叫醒一个take线程,如果恰好这个take线程挂了...

2020-03-27 17:07:42

jdk1.8 深入ArrayList源码解析

1.两个常用构造方法。默认创建一个0个元素的Object数组指定数组长度capacity2.添加元素方法1.set(int var1, E var2)方法在指定索引上替换元素。首先检查索引有没有越界,然后得到旧的元素,设置新值并返回旧的元素。2.add(E var1)方法首先检查是否需要扩容,然后在数组尾部添加元素。如果创建的List没有指定大小并且第一次添加元素则默认扩容...

2020-03-26 11:05:07
勋章 我的勋章
  • 持之以恒
    持之以恒
    授予每个自然月内发布4篇或4篇以上原创或翻译IT博文的用户。不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
  • 勤写标兵Lv2
    勤写标兵Lv2
    授予每个自然周发布4篇到6篇原创IT博文的用户。本勋章将于次周周三上午根据用户上周的博文发布情况由系统自动颁发。