【JDK1.8】JUC——LockSupport】的更多相关文章

一.前言 Basic thread blocking primitives for creating locks and other synchronization classes. 用于创建锁定和其他同步类的基本线程阻塞原语(基础?). 上面这段话是Java Doc对LockSupport的描述,表明了该类在实现锁当中的重要意义.因此我们先来查看一下其中的源码,看看它是如何实现的. 二.LockSupport成员变量分析 public class LockSupport { private s…
一.前言 前段时间结束了jdk1.8集合框架的源码阅读,在过年的这段时间里,一直在准备JUC(java.util.concurrent)的源码阅读.平时接触的并发场景开发并不很多,但是有网络的地方,就存在并发,所以想找几本书阅读深入一下,看到网上推荐较多的两本书<Java并发编程实战>和<Java多线程编程核心技术>.看了两书的优缺点后,笔者选择了先看后者,据说代码例子较多,书到手后,看完后的印象就是对并发的关键字.几个常见类的api进行了介绍,内容挺早以前,讲的也是不是很深,对J…
一.前言 在上一篇中,我们对LockSupport进行了阅读,因为它是实现我们今天要分析的AbstractQueuedSynchronizer(简称AQS)的基础,重新用一下最开始的图: 可以看到,在ReentrantLock,Semaphore,CountDownLatch,ReentrantReadWriteLock中都用到了继承自AQS的Sync内部类,正如AQS的java doc中一开始描述: Provides a framework for implementing blocking…
一.前言 在之前的几篇中,我们回顾了锁框架中比较重要的几个类,他们为实现同步提供了基础支持,从现在开始到后面,就开始利用之前的几个类来进行各种锁的具体实现.今天来一起看下ReentrantLock,首先来看一下Java doc 上对ReentrantLock的解释: ReentrantLock,作为可重入的互斥锁,具有与使用synchronized方法和语句相同的基本行为和语义,但功能更强大. 对上面这句话的解释: 拥有和synchronized关键字一样的行为,可重入互斥(注意,synchro…
一.前言 ​ 万丈高楼平地起,相信要想学好java,仅仅掌握基础的语法是远远不够的,从今天起,笔者将和园友们一起阅读jdk1.8的源码,并将阅读重点放在常见的诸如collection集合以及concurrent并发两块,另外笔者自己也是摸着石头过河,如果有描述不当的地方,希望园友们能够不吝指出,希望能够和大家共同进步! 二.jdk1.8新特性简述 ​ 相较于之前的jdk版本,jdk1.8加入了很多新特性,诸如Lambda表达式,函数式接口,时间的处理类等新特性,值得一提的是可以在Interfac…
前言 JUC中为了满足在并发编程中不同的需求,提供了几个工具类供我们使用,分别是CountDownLatch.CyclicBarrier和Semaphore,其原理都是使用了AQS来实现,下面分别进行介绍. CountDownLatch CountDownLatch的主要作用是利用计数来保证线程的执行顺序(我自己的理解),有点像倒计时,当计数为0时某个线程才能开始执行. CountDownLatch的主要方法很简单易用,包括: CountDownLatch(int count) : 构造方法,需…
一.前言 今天开始阅读jdk1.8的集合部分,平时在写项目的时候,用到的最多的部分可能就是Java的集合框架,通过阅读集合框架源码,了解其内部的数据结构实现,能够深入理解各个集合的性能特性,并且能够帮助自己在今后的开发中避免犯一些使用错误.另外笔者自己也是摸着石头过河,如果有描述不当的地方,希望园友们能够不吝指出,希望能够和大家共同进步! 二.集合框架概览图 可以看到集合的基础接口是Map, Collection以及Iterator.其余的类都实现自这3个类. 虚线箭头:依赖(即指向类里面包含了…
一.前言 笔者之前看过一篇关于jdk1.8的HashMap源码分析,作者对里面的解读很到位,将代码里关键的地方都说了一遍,值得推荐.笔者也会顺着他的顺序来阅读一遍,除了基础的方法外,添加了其他补充内容. 二.HashMap结构概览 以下是HashMap的数据结构: 不同于之前的jdk的实现,1.8采用的是数组+链表+红黑树,在链表过长的时候可以通过转换成红黑树提升访问性能.大多数情况下,结构都以链表的形式存在,所以检查是否存在树节点会增加访问方法的时间,但是相较于其优点来说还是可以接受的. 三.…
一.前言 在前面两篇随笔中,我们提到过,当HashMap的桶过大的时候,会自动将链表转化成红黑树结构,当时一笔带过,因为我们将留在本章中,针对TreeMap进行详细的了解. 二.TreeMap的继承关系 下面先让我们来看一下TreeMap的继承关系,对它有一个大致的了解: 可以看到,除了在之前HashMap里常见的继承类和接口以外,TreeMap实现了NavigableMap接口,而NavigableMap继承自SortedMap,由名字可以看出,只是一个用来实现排序的接口.而这也是为什么Tre…
好长一段时间前,某些场景需要JUC的读写锁,但在某个时刻内读写线程都报超时预警(长时间无响应),看起来像是锁竞争过程中出现死锁(我猜).经过排查项目并没有能造成死锁的可疑之处,因为业务代码并不复杂(仅仅是一个计算过程),经几番折腾,把注意力转移到JDK源码,正文详细说下ReentrantReadWriteLock的隐藏坑点. 过程大致如下: 若干个读写线程抢占读写锁 读线程手脚快,优先抢占到读锁(其中少数线程任务较重,执行时间较长) 写线程随即尝试获取写锁,未成功,进入双列表进行等待 随后读线程…
目录 Java小白的源码学习系列:HashMap 官方文档解读 基本数据结构 基本源码解读 基本成员变量 构造器 巧妙的tableSizeFor put方法 巧妙的hash方法 JDK1.8的putVal方法 JDK1.8的resize方法 初始化部分 数组搬移部分 Java小白的源码学习系列:HashMap 春节拜年取消,在家花了好多天时间啃一啃HashMap的源码,同样是找了很多很多的资料,有JDK1.7的,也有JDK1.8的,当然本文基于JDK1.8.将所学到的东西进行整理,希望回过头再看…
一.前言 在上一篇随笔中,我们分析了HashMap的源码,里面涉及到了3个钩子函数,用来预设给子类--LinkedHashMap的调用,所以趁热打铁,今天我们来一起看一下它的源码吧. 二.LinkedHashMap的结构与继承关系 2.1 LinkedHashMap的数据结构 可以从上图中看到,LinkedHashMap数据结构相比较于HashMap来说,添加了双向指针,分别指向前一个节点--before和后一个节点--after,从而将所有的节点已链表的形式串联一起来,从名字上来看Linked…
一.前言 在前一篇博客中,我们对TreeMap的继承关系进行了分析,在这一篇里,我们将分析TreeMap的数据结构,深入理解它的排序能力是如何实现的.这一节要有一定的数据结构基础,在阅读下面的之前,推荐大家先看一下:<算法4>深入理解红黑树.(个人比较喜欢算法四这里介绍的红黑树实现:从2-3树到红黑树的过渡很清晰,虽然源码里的实现不是这种方式 T^T),先了解一下红黑树的由来以及它的特性,这样能更好的理解TreeMap的实现. 二. TreeMap的结构 TreeMap的内部实现就是一个红黑树…
一.前言 今天我们来看一下本次集合源码阅读里的最后一个Map--IdentityHashMap.这个Map之所以放在最后是因为它用到的情况最少,也相较于其他的map来说比较特殊.就笔者来说,到目前为止还没有用到过它 ┐(゚-゚)┌.它的罕见与它的用途有关,当时的Map设计者是这么说的: This class is designed for use only in the rare cases wherein reference-equality semantics are required. 这…
一.前言 在前面几篇,我们已经学习了常见了Map,下面开始阅读实现Collection接口的常见的实现类.在有了之前源码的铺垫之后,我们后面的阅读之路将会变得简单很多,因为很多Collection的结构与Map的类似,甚至有不少是直接用了Map里的方法.接下来让我们一起来看一下ArrayList的源码. 二.ArrayList结构概览 顾名思义,ArrayList的结构实际就是一个Object[].所以它的特性很明显,插入一个元素的时候,是耗时是一个常量时间O(1),在插入n个元素的时候,需要的…
一.前言 这次我们来看一下常见的List中的第二个--LinkedList,在前面分析ArrayList的时候,我们提到,LinkedList是链表的结构,其实它跟我们在分析map的时候讲到的LinkedHashMap的结构有一定的相似,但是相对简单很多,今天再详细的看一下它的具体结构,以及使用的场景等. 二.LinkedList结构概览 在看具体的结构之前我们先来看一下它的继承关系: 与ArrayList不同的是,LinkedList继承了AbstractSequentialList,从Seq…
一.前言 这一篇里,我将对HashSet.LinkedHashSet.TreeSet进行汇总分析,并不打算一一进行详细介绍,因为JDK对Set的实现进行了取巧.我们都知道Set不允许出现相同的对象,而Map也同样不允许有两个相同的Key(出现相同的时候,就执行更新操作).所以Set里的实现实际上是调用了对应的Map,将Set的存放的对象作为Map的Key. 二.源码分析 这里笔者就以最常用的HashSet为例进行分析,其余的TreeSet.LinkedHashSet类似,就不赘述了. 2.1 结…
底层是用数组实现的 /** * The table, initialized on first use, and resized as * necessary. When allocated, length is always a power of two. * (We also tolerate length zero in some operations to allow * bootstrapping mechanics that are currently not needed.) */…
看到一道面试题,问Java中栈的实现方式,记录下一些实现细节. API中有5个方法,分别是: boolean empty() E peek() E pop() E push() int search(Object o) Java中stack继承vector,底层实现方式是数组. push:在数组末尾添加元素,添加之前保证数组容量足够.容量不够的话需要扩容,扩容策略如下: int newCapacity = oldCapacity + ((capacityIncrement > 0) ? capa…
JUC锁框架的目录整理如下: 1. [JUC]JUC锁框架综述 2. [JUC]JDK1.8源码分析之LockSupport(一) 3. [JUC]JDK1.8源码分析之AbstractQueuedSynchronizer(二) 4. [JUC]JDK1.8源码分析之ReentrantLock(三) 5. [JUC]JDK1.8源码分析之CyclicBarrier(四) 6. [JUC]JDK1.8源码分析之CountDownLatch(五) 7. [JUC]JDK1.8源码分析之Semapho…
JUC集合框架的目录整理如下: 1. [JUC]JUC集合框架综述 2. [JUC]JDK1.8源码分析之ConcurrentHashMap(一) 3. [JUC]JDK1.8源码分析之ConcurrentSkipListMap(二) 4. [JUC]JDK1.8源码分析之ArrayBlockingQueue(三) 5. [JUC]JDK1.8源码分析之LinkedBlockingQueue(四) 6. [JUC]JDK1.8源码分析之ConcurrentLinkedQueue(五) 7. [J…
[集合框架]JDK1.8源码分析之HashMap(一)   一.前言 在分析jdk1.8后的HashMap源码时,发现网上好多分析都是基于之前的jdk,而Java8的HashMap对之前做了较大的优化,其中最重要的一个优化就是桶中的元素不再唯一按照链表组合,也可以使用红黑树进行存储,总之,目标只有一个,那就是在安全和功能性完备的情况下让其速度更快,提升性能.好~下面就开始分析源码. 二.HashMap数据结构 说明:上图很形象的展示了HashMap的数据结构(数组+链表+红黑树),桶中的结构可能…
[集合框架]JDK1.8源码分析之ArrayList详解(一) 一. 从ArrayList字表面推测 ArrayList类的命名是由Array和List单词组合而成,Array的中文意思是数组,List的中文意思是列表.从ArrayList字表面推测,ArrayList类是否有数组和列表的特征?那么,这些特征这在ArrayList类中又是怎么体现的? ArrayList源码分析 public class ArrayList<E> extends AbstractList<E> im…
一.简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子说明在什么场景下适合使用. 这个教程包含Java开发者经常面对的几类问题: 语言 编译器 库 工具 运行时(JVM) 二.Java语言的新特性 Java 8是Java的一个重大版本,有人认为,虽然这些新特性领Java开发人员十分期待,但同时也需要花不少精力去学习.在这一小节中,我们将介绍Java…
目录: 一.首先,需要安装.配置jdk 二.其次,安装.配置JMeter 三.JMeter汉化以及更改界面背景 四.附录:个人学习总结 一.首先,需要安装.配置jdk   返回目录 1.到官网下载1.8jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.安装jdk后,配置环境变量: ①在系统变量新建JAVA_HOME [变量名]:JAVA_HOME [变量值]:F:\r…
安装不易,且安且珍惜! 1 下载 Java JDK (http://java.sun.com/javae/downloads/ ) (Windows 版) [配置环境变量]:安装完成后,设置JAVA_HOME环境变量以指向JDK安装文件夹: [具体操作]:[开始] —> [我的电脑] —> [右键属性] —> [高级] —> [单击环境变量] (单击“新建”添加JAVA_HOME变量,如果该变量已经存在,单击“编辑”修改它,JAVA_HOME的值类似于D:\Program File…
[环境参数] Host:Win7 64bit VMware:VMware Workstation11.1.0 Client OS:CentOS release 6.5 (Final) 2.6.32-431.el6.x86_64 Third-Party Software: ①Apache_OpenOffice_4.1.1_Linux_x86-64_install-rpm_zh-CN.tar ②swftools-2013-04-09-1007.tar.gz ③xpdf-chinese-simplif…
首先准备好自己下载的Tomcat7的绿色版,一定要是解压的绿色版不能使exe安装包.因为exe安装版很多变量不好配置,我以前最喜欢exe版了,方便快捷,但是我发现还是绿色解压版比较好,优化配置等也很好上手. 下面有两个文件非常重要, 1)C:\tomcat\apache-tomcat-7.0.41\conf\server.xml 这个文件主要是为了配置server shutdown端口号(<Server port="8305" shutdown="SHUTDOWN&qu…
前言:本人操作系统为Windows7 64位,用的是32位的安装包,32位系统没有验证. 一.首先下载以下安装包,如果提供的链接失效请自行下载: (1) Android SDK (Windows 32-bit ADT版): [直接下载]http://dl.google.com/android/adt/adt-bundle-windows-x86-20131030.zip (2) Android NDK(Windows 32-bit): [直接下载]http://dl.google.com/and…
[Java面试]基础知识篇 Java基础知识总结,主要包括数据类型,string类,集合,线程,时间,正则,流,jdk5--8各个版本的新特性,等等.不足的地方,欢迎大家补充.源码分享见个人公告.JavaCommon项目 基础: (1)基本数据类型 (2)运算符操作 (3)异常 (4)String,StringBuffer,StringBuilder相关 (5)Number类型相关 (6)随机数.Math.random() 集合操作: (1)集合中的List (2)集合中的Stack (3)集合…