首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏学习计划

    JDK 7 ConcurrentHashMap源码解读

    原理分析 HashMap存在并发问题,jdk有提供HashTable,这个HashTable是对HashMap中的所以方法加锁以达到线程安全,但是,这种方式会使得性能下降,看下面的图,假如有两个线程分别要 源码 它有这些个属性: // 默认初始大小 static final int DEFAULT_INITIAL_CAPACITY = 16; // 默认加载因子 static final

    50310发布于 2021-01-29
  • 来自专栏java小白

    Jdk7HashMap源码分析

    下面为HashMap构造函数的源码: //无参构造器 public HashMap() { //默认初始容量大小为16,默认的加载因子为0.75f this

    62650发布于 2018-05-24
  • 来自专栏一个正经的程序员

    CentOS7(Linux)源码安装JDK

    介绍 Java工作者第一步一定是安装JDK了,可是还有小伙伴不会在Linux上安装JDK,毕竟我们开发的项目都是要在服务器上运行的,今天就来讲讲如何在CentOS7环境使用源码进行安装JDK。 下面使用jdk-8u221-linux-x64.tar.gz做演示 安装 创建一个资源目录把JDK上传到这个目录下 mkdir /usr/local/resource 解压安装包,解压后可以把安装包删除 tar -zxvf jdk-8u221-linux-x64.tar.gz 创建JDK的安装目录 mkdir /usr/local/java 移动解压好的安装包到安装目录 mv /usr/local/resource /etc/profile 在文件末尾添加如下代码,JAVA_HOME=和JRE_HOME=后面是JDK的安装目录 # JDK Configuration export JAVA_HOME=/usr/local /java/jdk1.8.0_221 export JRE_HOME=/usr/local/java/jdk1.8.0_221/jre export CLASSPATH=.

    93460编辑于 2022-04-11
  • 来自专栏JavaEdge

    Java 集合源码解析 - ConcurrentHashMap(JDK7

    return sun.misc.Hashing.stringHash32((String) k); } h ^= k.hashCode(); h += (h << 15) ^ 0xffffcd7d 来保护不同段的数据,在插入和获取元素时,先通过散列算法定位到Segment private static int hash(int h) { h += (h << 15) ^ 0xffffcd7d segmentMask为15,再散列后的数最大是32位二进制数据,向右无符号移动28位,即让高4位参与到散列运算中,(hash>>>segmentShift)&segmentMask的运算结果分别是4、15、77 ConcurrentHashMap 实现高并发的总结 7.1 基于通常情形而优化 在实际的应用中,散列表一般的应用场景是:除了少数插入操作和删除操作外,绝大多数都是读操作,而且读操作在大多数时候都是成功的

    1.1K20编辑于 2022-11-30
  • 来自专栏码云大作战

    HashMap源码分析 - JDK7JDK8有什么区别

    前几天的文章中对JDK8的HashMap源码进行了分析,这篇文章是基于JDK8的基础上来分析下与JDK7的HashMap的区别。以下的源码主要为JDK7中HashMap的源码。 一、变量 JDK7中内部的变量比较简单,并且这些通用的变量在JDK8中也都是有的。 · JDK7 内部结构为数组+链表的底层结构。 ^ (h >>> 4); } JDK7中需要进行复杂的运算其实主要就是为了提高key的散列性,减少hash冲突。 JDK7中是通过插入头结点的方式,而在JDK8中是通过插入尾结点的方式。

    49410发布于 2020-08-26
  • 来自专栏java学习java

    JDK 7 ConcurrentHashMap

    概述 JDK1.7中的ConcurrentHashMap间接地实现了Map,并将每一个元素称为分段锁segment,每个segment都是一个HashEntry<K,V>数组,称为table,table 它维护了一个 segment 数组,每个 segment 对应一把锁 优点:如果多个线程访问不同的 segment,实际是没有冲突的,这与 jdk8 中是类似的 缺点:Segments 数组默认大小为16

    36320编辑于 2023-10-15
  • 来自专栏WriteOnRead

    JDK 源码 - 前言

    以前读过一些 JDK 常用的源码。当时的做法是在 IDE 打开源码文件,同时打开官方文档和谷歌翻译,一边读一边翻译,那时觉得还颇有收获。但是,由于基础薄弱,为了加快速度,有很多不理解的地方跳过了。

    41730发布于 2019-08-16
  • 来自专栏代码人生

    jdk源码-HashMap

    AbstractMap是Map接口的抽象实现类,通过抽象方法keySet()实现了get(key),remove(key),containsKey(key),containsValue(value)的基本算法,遍历加equals。

    49120发布于 2019-10-30
  • 来自专栏王小雷

    centos 7 安装JDK (Linux安装jdk)

    centos 7安装JDK (Linux安装jdk) 第一部分 首先查看centos 7是否有openjdk,如没有就跳过第一部分,直接第二部分。 noarch java-1.8.0-openjdk-headless-1.8.0.65-3.b17.el7.x86_64 java-1.7.0-openjdk-1.7.0.91-2.6.2.3.el7. x86_64 java-1.8.0-openjdk-1.8.0.65-3.b17.el7.x86_64 java-1.7.0-openjdk-headless-1.7.0.91-2.6.2.3.el7. -2015g-1.el7.noarch 第二部分 安装jdk 默认jdk文件已经解压至/opt 2.0 配置环境变量 [root@bogon opt]# vim /etc/profile.d/java.sh 2.1 在vim中写入 JAVA_HOME=/opt/jdk1.8.0_72 JRE_HOME=/opt/jdk1.8.0_72/jre CLASSPATH=.

    7.7K70发布于 2018-01-02
  • JDK源码解读:CountDownLatch源码解析

    这个区别,就是 await(long timeout, TimeUnit unit) 多了一个超时判断步骤,所在源码如下: public final boolean tryAcquireSharedNanos GC return true; } } // 【7】 计算截止时间deadline 【4】将当前线程加入等待队列/ 进入一个for死循环,除非正常或者异常退出 【5】检查前驱结点是否是头结点 【6】如果成功获取锁,则更新头节点并传播状态,返回true 【7】 取消申请 countDown:倒计时源码 public void countDown() { sync.releaseShared(1); } public return false; } 代码分析: 【1】回调CountDownLatch#Sync的tryReleaseShared方法,返回倒计时是否等于0的判断 【2】如果倒计时到0了,则进行释放倒计时 源码分析

    60700编辑于 2024-11-20
  • 来自专栏WriteOnRead

    JDK源码分析-PriorityBlockingQueue

    概述 前文「JDK源码分析-PriorityQueue」分析了优先队列 PriorityQueue,它既不是阻塞队列,而且线程不安全。 juejin.im/post/5cc258796fb9a03228616e6e https://blog.csdn.net/codejas/article/details/89190774 相关阅读: JDK 源码分析-PriorityQueue JDK源码分析-ReentrantLock Stay hungry, stay foolish.

    49630发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-Collection

    到一个 Object 数组中; 5.2 T[] toArray(T[] a): 作用同 5.1,区别在于该方法可以指定数组的类型(这两个方法用于集合与数组之间的转换); 6. add(E): 添加元素; 7. super E>): 从该集合中移除满足指定条件的元素,其中 Predicate 是 JDK 1.8 引入的函数式操作,即传入的参数是一个方法; 12. retainAll(Collection<? 16. spliterator(): 可分割迭代器,用于并行遍历集合中的元素(iterator() 方法是顺序遍历); 17. stream() & parallelStream(): JDK 1.8 super T>) 方法,该方法也是 JDK 1.8 引入的,提供遍历集合元素的函数式操作。 PS: JDK 版本如下: ? 阅读源码时,个人以为应该先读接口类,而非具体的实现类。原因有二: 1. 实现类的代码一般较多,如果初读源码就钻到实现类,可能容易被搞蒙。 Stay hungry, stay foolish

    66520发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-ThreadPoolExecutor

    概述 ThreadPoolExecutor 是 JDK 中线程池的实现类,它的继承结构如下: ? maximumPoolSize: 最大池大小,线程池中能同时存在的最大线程数,大于等于 corePoolSize; workQueue: 工作/任务队列,是一个阻塞队列,可参考前文「JDK 源码分析-BlockingQueue」的分析。 runWorker(this); } // 其他一些 AQS 相关的方法不再一一列举} 可以看到 Worker 类继承自 AQS,它的实现与 ReentrantLock 有一些类似,可对比前文「JDK 源码分析-ReentrantLock」分析。

    56920发布于 2019-08-30
  • 来自专栏WriteOnRead

    JDK源码分析-Semaphore

    具体可参考前文对 AQS 共享模式的分析「JDK源码分析-AbstractQueuedSynchronizer(3)」。 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.

    54520发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-CountDownLatch

    ; } 其中,acquireSharedInterruptibly、tryAcquireSharedNanos 和 releaseShared 都是 AQS 中「共享模式」的方法,具体代码可参考前文「JDK 源码分析-AbstractQueuedSynchronizer(3)」的分析。 Thread-1 add 5 Thread-1 add 6 Thread-1 add 7 Thread-1 add 8 Thread-1 add 9 */ 小结 CountDownLatch 相关阅读: JDK源码分析-AbstractQueuedSynchronizer(3) Stay hungry, stay foolish.

    46920发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-LinkedList

    结点类 Node 查看 LinkedList 的源码可发现它内部有个嵌套类 Node,代码如下: private static class Node<E> { E item; // 存储的数据 相关阅读: JDK源码-Queue, Deque Stay hungry, stay foolish.

    40020发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-CyclicBarrier

    CyclicBarrier 是并发包中的一个工具类,它的典型应用场景为:几个线程执行完任务后,执行另一个线程(回调函数,可选),然后继续下一轮,如此往复。

    47420发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-LinkedHashMap

    概述 前文「JDK源码分析-HashMap(1)」分析了 HashMap 主要方法的实现原理(其他问题以后分析),本文分析下 LinkedHashMap。

    49520发布于 2019-08-16
  • 来自专栏WriteOnRead

    JDK源码分析-Hashtable

    tab[] = table; // 计算 key 在 table 中的索引 int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF 则扩容 rehash(); tab = table; hash = key.hashCode(); index = (hash & 0x7FFFFFFF > tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; > tab[] = table; int hash = key.hashCode(); int index = (hash & 0x7FFFFFFF) % tab.length; 相关阅读: JDK源码分析-HashMap(1) Stay hungry, stay foolish.

    53710发布于 2019-08-16
  • 来自专栏全栈程序员必看

    CentOS 7 yum卸载jdk、安装jdk以及配置jdk环境

    CentOS 7 yum卸载jdk、安装jdk以及配置jdk环境 查看是否已经安装jdk 通过命令查询是否已经安装jdk //括号中选择一个即可 yum list installed | grep [java ][jdk] 运行结果类似下图则说明系统已经存在jdk,可卸载 卸载jdk(若未存在jdk不用执行) 卸载的jdk按已存在的jdk版本进行卸载,示例为jdk1.8.0,不知版本号可观上图 #卸载所有 查看jdk软件包列表 yum search java | grep -i --color jdk 选择需要的版本进行安装,这里安装1.8.0版本 #选择需要的文件进行安装 yum install JAVA_HOME的值按实际目录路径给值 # set java environment JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_ 7.x86_64 PATH=$PATH:$JAVA_HOME/bin CLASSPATH=.

    5.8K10编辑于 2022-09-01
领券