![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
java
文章平均质量分 97
DivineH
这个作者很懒,什么都没留下…
展开
-
Java并发编程之ConcurrentLinkedQueue详解
简介在并发编程中我们有时候需要使用线程安全的队列。如果我们要实现一个线程安全的队列有两种实现方式一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现,而非阻塞的实现方式则可以使用循环CAS的方式来实现,下面我们一起来研究下Doug Lea是如何使用非阻塞的方式来实现线程安全队列ConcurrentLinked...原创 2018-06-26 10:00:26 · 80241 阅读 · 23 评论 -
Java并发编程之ReentrantLock详解
---原创 2018-05-31 19:47:31 · 21706 阅读 · 2 评论 -
Java并发编程之LockSupport、Unsafe详解
简介在Java多线程中,当需要阻塞或者唤醒一个线程是,都会使用LockSupport工具类来完成相应的工作。LockSupport定义了一组公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功能,而LockSupport也因此成为了构建同步组件的基础工具。LockSupport定义了一组以park开头的方法用来阻塞当前线程,以及unpark(Thread)方法来唤醒一个被阻塞的线程,这些方法描述如...原创 2018-05-30 20:12:07 · 10113 阅读 · 0 评论 -
Java动态代理详解(一)
简介静态代理动态代理原创 2018-06-21 11:37:00 · 302 阅读 · 0 评论 -
Java并发编程之自定义同步组件
队列同步器AbstractQueuedSynchronizer,是用来构建锁或者其他同步组件的基础框架,我们前面已经对该类进行了实现层面的分析,下面我们编写两个自定义同步组件来加深对AQS的理解。自定义独占锁同步组件设计一个同步工具:该工具在同一时刻,只允许一个线程访问,超过一个线程的访问将被阻塞,我们将这个同步器命名为Mutex。首先,确定访问模式,Mutex在同一时刻只支持一个线程的访问,这显...原创 2018-05-30 16:44:18 · 346 阅读 · 0 评论 -
Java内部类详解
简介可以将一个类的定义放在另一个类的定义内部,这就是内部类。内部类允许你把一些逻辑相关的类组织在一起,并控制内部类的可见性。然而必须要了解,内部类与组合是完全不同的概念,这一点很重要。那为什么需要内部类呢?一般来说,内部类继承自某个类或实现某个接口,内部类的代码可以操作创建它的外围类的独对象。所以可以认为内部类提供了某种进入其外围类的窗口。那如果只需要一个对接口的引用,为什么不通过外围类来实现接口...原创 2018-06-13 15:28:26 · 208 阅读 · 0 评论 -
Java并发编程之LinkedTransferQueue阻塞队列详解
简介LinkedTransferQueue是一个由链表结构组成的无界阻塞TransferQueue队列。相对于其他阻塞队列,LinkedTransferQueue多了tryTransfer和transfer方法。原创 2018-06-07 15:42:34 · 15777 阅读 · 0 评论 -
Java并发编程之LinkedBlockingDeque阻塞队列详解
简介LinkedBlockingDeque是一个由链表结构组成的双向阻塞队列,即可以从队列的两端插入和移除元素。双向队列因为多了一个操作队列的入口,在多线程同时入队时,也就减少了一半的竞争。相比于其他阻塞队列,LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法,以first结尾的方法,表示插入、获取获移除双端队列的第一个元素。以l...原创 2018-06-06 13:41:01 · 28874 阅读 · 0 评论 -
Java并发编程之DelayQueue阻塞队列详解
简介DelayQueue是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以指定多久才能从队列中获取当前元素。只有在延迟期满时才能从队列中提取元素。DelayQueue非常有用,可以运用在以下两个应用场景: 缓存系统的设计:使用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦...原创 2018-06-06 11:16:30 · 10310 阅读 · 0 评论 -
Java并发编程之PriorityBlockingQueue阻塞队列详解
简介PriorityBlockingQueue是一个支持优先级的无界阻塞队列。默认情况下元素采用自然顺序升序排列。也可以自定义类实现compareTo()方法来指定元素排序规则,或者初始化PriorityBlockingQueue时,指定构造参数Comparator来对元素进行排序。但需要注意的是不能保证同优先级元素的顺序。PriorityBlockingQueue有四个构造方法:// 默认的构造...原创 2018-06-06 10:30:49 · 3393 阅读 · 0 评论 -
Java并发编程之SynchronousQueue阻塞队列详解
简介SynchronousQueue是一个不存储元素的队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。它支持公平访问队列。默认情况下线程采用非公平性策略访问队列。SynchronousQueue类只有两个构造方法:public SynchronousQueue() { this(false);}public SynchronousQueue(boo...原创 2018-06-07 11:13:24 · 4597 阅读 · 4 评论 -
Java并发编程之ConcurrentHashMap详解
简介我们知道,HashMap并不是线程安全的,要使用线程安全的HashMap,可以用HashTable或者通过Collections.synchronizedMap方法来获取一个线程安全的Map,但是这两种线程安全的Map都是使用synchronized来保证线程安全,因此,在多线程竞争激烈的情况下,它们的效率非常低。因为当一个线程访问synchronized同步方法时,其他线程访问Map,可能会...原创 2018-06-25 10:15:28 · 849 阅读 · 0 评论 -
Java集合之LinkedHashMap详解
简介LinkedHashMap继承自HashMap,与HashMap有着类似的存储结构,LinkedHashMap类声明如下:public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>它继承于HashMap,实现了Map接口。LinkedHashMap是非线程安全的,只是用于单...原创 2018-06-15 17:00:24 · 1140 阅读 · 0 评论 -
Java集合之TreeMap详解
简介TreeMap是一个有序的key-value集合,它是通过红黑树实现的。它的每一个元素是一个key-value对,TreeMap类声明如下:public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, java.io.Serializab...原创 2018-06-15 13:38:50 · 1651 阅读 · 1 评论 -
Java并发编程之ReentrantReadWriteLock详解
简介ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,实际上独占锁是一种相对比较保守的锁策略, 在这种情况下任何"读/读", "读/写", "写/写"操作都不能同时发生,这在一定程度上面减低了吞吐量。然而读操作之间不存在数据竞争问题,如果"读/读"操作能够以共享锁的方式进行,那会进一步提升性能。因此引入了ReentrantReadWriteLock,顾名思义,Reent...原创 2018-06-02 16:12:26 · 4111 阅读 · 2 评论 -
Java集合之HashTable详解
简介Hashtable和HashM类似,同样是基于哈希表实现的,同样每个元素是一个key-value对,但其内部只是通过单链表解决哈希冲突问题,而没有红黑树结构,当HashTable容量不足(超过了阀值)时,同样会进行扩容操作。Hashtable类声明如下:public class Hashtable<K,V> extends Dictionary<K,V> impleme...原创 2018-06-15 09:58:49 · 2197 阅读 · 0 评论 -
Java并发编程之Fork/Join框架详解
简介Fork/Join框架是Java7提供了的一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。Fork/Join的运行流程如下图所示:工作窃取算法工作窃取(work-stealing)算法是指某个线程从其他队列里窃取任务来执行。那么为什么需要使用工作窃取算法呢?假如我们需要做一个比较大的任务,我们可以把这个任务分割为...原创 2018-06-07 17:11:26 · 987 阅读 · 0 评论 -
Java集合之HashMap详解
简介HashMap是基于哈希表实现的,每一个元素是一个key-value对,HashMap类声明如下:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable它继承于AbstractMap,实现了Map、Cloneable、 Se...原创 2018-06-14 15:15:43 · 2643 阅读 · 2 评论 -
Class.newInstance()与new、Constructor.newInstance()的区别
在初始化一个类,生成一个实例的时候,newInstance() 和 new 有什么区别?用newInstance与用new是区别的,区别在于创建对象的方式不一样,前者是使用类加载机制,那么为什么会有两种创建对象方式?这个就要从可伸缩、可扩展,可重用等软件思想上解释了。 Java中工厂模式经常使用newInstance来创建对象,因此从为什么要使用工厂模式上也可以找到具体答案。 例如: Class ...转载 2018-06-21 17:23:29 · 2657 阅读 · 1 评论 -
Java动态代理详解(二)
简介我们在Java动态代理详解(一)这篇博客中已经为大家介绍了代理模式,并且简单介绍了JDK静态代理、JDK动态代理以及cglib动态代理。我们在这一篇博客中,将会从源码的角度来对JDK动态代理进行详细讲解。在上一篇博客中,我们使用动态代理的核心代码如下:public class SubjectProxy implements InvocationHandler { private Subjec...原创 2018-06-21 20:21:11 · 292 阅读 · 0 评论 -
Java并发编程之ArrayBlockingQueue阻塞队列详解
简介ArrayBlockingQueue是一个用数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。ArrayBlockingQueue默认情况下不保证线程公平地访问队列,即阻塞的线程,不一定按阻塞的先后顺序访问队列,非公平性也是为了提高吞吐率。ArrayBlockingQueue有三个构造方法:// capacity是该阻塞队列的容量大小,该构造方法会调用this(cap...原创 2018-06-05 13:19:57 · 3102 阅读 · 0 评论 -
Java并发编程之LinkedBlockingQueue阻塞队列详解
简介LinkedBlockingQueue是一个用链表实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。此队列的默认和最大长度是Integer.MAX_VALUE,LinkedBlockingQueue类有三个构造方法:// 默认构造方法,该方法会调用this(Integer.MAX_VALUE),即默认最大长度是Integer.MAX_VALUEpublic Linked...原创 2018-06-05 19:29:54 · 2950 阅读 · 0 评论 -
Java集合之Vector详解
简介Vector的内部实现类似于ArrayList,Vector也是基于一个容量能够动态增长的数组来实现的,该类是JDK1.0版本添加的类,它的很多实现方法都加入了同步语句,因此是线程安全的(但Vector其实也只是相对安全,有些时候还是要加入同步语句来保证线程的安全,我们后面会有例子来说明这一点)。Vector类声明如下:public class Vector<E> extends ...原创 2018-06-12 15:54:11 · 13591 阅读 · 1 评论 -
Java并发编程之CountDownLatch详解
简介闭锁是一种同步工具类,可以延迟线程的进度,直到其到达终止状态。闭锁的作用相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能够通过,当达到结束状态时,这扇门会打开并允许所有的线程通过。当闭锁到达结束状态后,将不会再改变状态,因此这扇门将永远保持打开状态。闭锁可以确保某些活动直到其他活动都完成之后才继续执行。CountDownLatch是一种灵活的闭锁实现,它允许...原创 2018-06-03 17:07:49 · 2189 阅读 · 0 评论 -
Java并发编程之Condition详解
简介在Java程序中,任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object类上),主要包括wait()、wait(long)、notify()、notifyAll()方法,这些方法与synchronized关键字配合,可以实现等待/通知模式。Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特...原创 2018-06-03 14:26:22 · 8169 阅读 · 4 评论 -
Java并发编程之ThreadLocal详解
ThreadLocal简介变量值的共享可以使用public static的形式,所有线程都使用同一个变量,如果想实现每一个线程都有自己的共享变量该如何实现呢?JDK中的ThreadLocal类正是为了解决这样的问题。ThreadLocal类并不是用来解决多线程环境下的共享变量问题,而是用来提供线程内部的共享变量,在多线程环境下,可以保证各个线程之间的变量互相隔离、相互独立。在线程中,可以通过get...原创 2018-05-27 14:14:44 · 43978 阅读 · 13 评论 -
Java线程的interrupt()、interrupted()、isInterrupted()与InterruptedException
1、中断 中断可以理解为线程的一个标识位属性,它表示一个运行中的线程是否被其他线程进行了中断操作。这就好比其它线程对该线程打了声招呼,其它线程通过调用该线程的interrupt()方法对其进行中断操作。 中断是一种协作机制。当一个线程中断另一个线程时,被中断的线程不一定要立即停止正在做的事情。相反,中断是礼貌地请求另一个线程在它愿意并且方便的时候停止它正在做的事情。interr...原创 2018-05-22 13:03:27 · 663 阅读 · 0 评论 -
Java并发编程之synchronized详解
在Java多线程编程中,synchronized一直是元老级角色,很多人称呼它为重量级锁,但是随着Java SE1.6对其进行了各种优化之后,有些情况下它就不再那么重了,我们先看下利用synchronized实现同步的基础:Java中每一个对象都可以作为锁,具体表现为以下三种:1、对于普通同步方法,锁是当前实例对象;2、对于静态同步方法,锁是当前类的Class对象;3、对于同步方法块,锁是sync...原创 2018-05-22 20:51:31 · 1683 阅读 · 0 评论 -
Java并发编程之Object.wait()/notify()详解
等待/通知机制一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另外一个线程。前者是生产者,后者是消费者,这种模式隔离了“做什么”(What)和“怎么做”(How),在功能层面上实现了解耦,体系结构上具备良好的伸缩性,在Java语言中是如何实现类似的等待/通知机制的呢?最简单的方式就是让消费者不断地循环检查变量是否符合预期,如下面代码所...原创 2018-05-24 13:20:20 · 22543 阅读 · 4 评论 -
Java虚拟机之类加载机制详解(一)
虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。在Java中,类型的加载、连接和初始化过程都是在程序运行期间完成的,这种策略虽然会令类加载时稍微增加一点性能开销,但是会为Java应用程序提供高度的灵活性。类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载、验证、准备、解...原创 2018-05-24 20:08:49 · 1336 阅读 · 1 评论 -
Java虚拟机之类加载机制详解(二)
虚拟机设计团队把类加载阶段中的“通过一个类的全限定名来获取定义此类的二进制字节流”这个动作放到Java虚拟机外部去实现,以便让应用程序自己决定如何去获取所需要的类。实现这个动作的代码模块称为“类加载器”。类与类加载器类加载器虽然只用于实现类的加载动作,但它在Java程序中起到的作用却远远不限于类加载阶段。类加载主要有以下几个作用:通过一个类的全限定名来获取定义此类的二进制字节流;审查每一类应该有谁...原创 2018-05-25 13:08:12 · 876 阅读 · 1 评论 -
Java虚拟机之强引用、软引用、弱引用、虚引用详解
背景在JDK 1.2以前,Java中的引用定义很传统:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过狭隘,一个对象在这种定义下,只有被引用或者没有被引用这两种状态,对于如何描述一些“食之无味,弃之可惜”的对象就显得无能为力。我们对于这样一类对象需要一种新的引用方式:当内存空间还足够时,则能保留在内存之中;如果内存空...原创 2018-05-26 15:51:14 · 2383 阅读 · 0 评论 -
Java并发编程之CyclicBarrier详解
简介栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。CyclicBarrier可以使一定数量的线程反复地在栅栏位置处汇集。当线程到达栅栏位置时将调用await方法,这个方法将阻塞直到所有线程都到达栅栏位置。如果所有线程都到达栅栏位置,那么栅栏将打开,此时所有的线程都将被释放,而栅栏...原创 2018-06-03 21:12:35 · 63853 阅读 · 7 评论 -
Java并发编程之Semaphore详解
简介计数信号量(Counting Semaphore)用来控制同时访问某个特定资源的操作数量,或者同时执行某个指定操作的数量。计数信号量还可以用来实现某种资源池,或者对容器施加边界。Semaphore中管理着一组虚拟许可(permit),许可的初始数量可以通过构造函数来指定,在执行操作时可以首先获得许可(只要还有剩余的许可),并在使用之后释放许可。如果没有剩余许可,那么获取许可的acquire操作...原创 2018-06-04 10:33:12 · 531 阅读 · 0 评论 -
Java集合之LinkedList详解
简介LinkedList是基于双向链表实现的,LinkedList同样是非线程安全的,只在单线程下适合使用。LinkedList类声明如下:public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java...原创 2018-06-12 14:44:17 · 427 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer详解(四)
AQS的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法会调用使用者重写的方法。AQS提供的模板方法基本上分为三类:独占式获取与释放同步状态、共享式获取与释放同步状态和查询同步队列中的等待线程情况,自定义同步组件将使用同步器提供的模板方法来实现自己的同步语义。下面我们主要分析共享式同步状态...原创 2018-05-29 16:41:54 · 756 阅读 · 0 评论 -
Java集合之ArrayList详解
简介ArrayList是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List、RandomAccess、Cloneable、 Serializable等接口。ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List l)函数返回一个线程安全的...原创 2018-06-11 21:21:24 · 1923 阅读 · 1 评论 -
Java集合简介
简介Java集合工具包位于java.util包下,包含了很多常用的数据结构,如数组、链表、栈、队列、集合、哈希表等。学习Java集合框架下大致可以分为如下五个部分:List列表、Map映射、Set集合、迭代器(Iterator、Enumeration)、工具类(Arrays、Collections)。Java集合类的整体框架如下:此图来源于http://blog.csdn.net/...原创 2018-06-11 18:59:18 · 301 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer详解(三)
AQS的设计是基于模板方法模式的,也就是说,使用者需要继承同步器并重写指定的方法,随后将同步器组合在自定义同步组件的实现中,并调用同步器提供的模板方法,而这些模板方法会调用使用者重写的方法。AQS提供的模板方法基本上分为三类:独占式获取与释放同步状态、共享式获取与释放同步状态和查询同步队列中的等待线程情况,自定义同步组件将使用同步器提供的模板方法来实现自己的同步语义。我们主要分析同步状态的获取与释...原创 2018-05-29 11:34:57 · 1695 阅读 · 0 评论 -
Java并发编程之AbstractQueuedSynchronizer详解(二)
同步器依赖于内部的FIFO双向等待队列来完成同步状态的管理,该等待队列是CLH队列的变种,CLH队列通常用于自旋锁,同步器中的等待队列可以简单的理解为“等待锁的线程队列”。当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个节点(Node)并将其加入同步队列,同时会阻塞当前线程,当同步状态释放时,会把首节点中的线程唤醒,使其再次尝试获取同步状态。同步队列中的节点(Node)用...原创 2018-05-28 16:07:41 · 1886 阅读 · 0 评论