[TOC]Java并发工具CountDownLatch和CyclicBarrier原理解析一,简介CountDownLatch允许一个或者多个线程等待其他线程完成操作。CyclicBarrier的字面意思是可循环使用(Cyclic)的屏障(Barrier)。它要做的事情是,让一组线程达到一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
[TOC]LinkedTransferQueue1.8源码解析一,简介LinkedTransferQueue是一个由链表结构组成的×××阻塞传输队列,它是一个很多队列的结合体(ConcurrentLinkedQueue,LinkedBlockingQueue,SynchronousQueue),在除了有基本阻塞队列的功能(但是这个阻塞队列没有使用锁)之外;队列实现了TransferQueue接口重写
[TOC]SynchronousQueue1.8源码解析一,简介SynchronousQueue是一个很奇怪的队列,感觉都不能叫队列,因为内部没有数据的存储空间,队列不能peek,因为不存在元素,任何入队的线程都会阻塞,直到有线程来出队,也就是这个队列是一组操作,入队和出队要一起离开,出队也是一样,必须等入队,必须结伴而行;队列支持公平和非公平的模式(指的是队列匹配线程的顺序),公平模式的数据结构
[TOC]PriorityBlockingQueue1.8源码解析一,简介PriorityBlockingQueue是一个支持优先级的×××阻塞队列,数据结构采用的是最小堆是通过一个数组实现的,队列默认采用自然排序的升序排序,如果需要自定义排序,需要在构造队列时指定Comparetor比较器,队列也是使用ReentrantLock锁来实现的同步机制。二,UML图三,基本成员//数组的最大容量2^31
[TOC]LinkedBlockingQueue1.8源码详解一,简介LinkedBlockingQueue是一个用链表实现的有界阻塞队列;此队列的默认和最大长度为Integer.MAX_VALUE;此队列按照先进先出的原则对元素就行排序;队列有两个锁,生成和消费各一把锁,都是默认的非公平锁。二,类UML图三,基本成员staticclassNode<E>{//我们插入的值Eitem;/
[TOC]ArrayBlockingQueue1.8源码浅析一,简介ArrayBlockingQueue是一个用数组实现的有界队列;此队列按照先进先出(FIFO)的规则对元素进行排序;默认情况下不保证线程公平的访问队列,所谓公平访问队列是指阻塞的线程,可以按照阻塞的先后顺序的访问队列,即先阻塞的线程先访问队列;非公平性是对先等待的线程是非公平的,当队列可用时,阻塞的线程都可以争夺访问队列的资格,有
[TOC]ConcurrentLinkedQueue1.8源码浅析一,简介ConcurrentlinkedQueue还是一个基于链表的,×××的,线程安全的单端队列,它采用先进先出(FIFO)的规则对节点进行排序,当我们加入一个元素时,它会插入队列的尾部,当我们获取元素时,会从队列的首部获取元素。它没有使用锁来保证线程安全,使用的是“wait-free”算法来保证整个队列的线程安全。二,基本成员简介
一、简介前面的一篇文章我们介绍了ConcurrentHashMap1.7版本版本的源码介绍,我们知道1.7版本的ConcurrentHashMap采用的是分段锁的思想,提高了锁的数量,提高了并发的特性,但是也有其局限性,例如就是并发的数量也就是锁的数量是不可改变的等;我们今天要介绍的1.8版本的ConcurrentHashMap其实也是采用了多锁的思想,不过在1.8中没有了segments这些东西
一、ReentrantReadWriteLock简介上一篇文章我们将讲到的ReentrantLock和Synchronized锁,都属于排他锁,也就是说只会有一个线程获取锁;而我们今天讲的ReentrantReadWriteLock(读写锁)是支持多个线程同时获取锁的在获取读锁时;但是在获取到写锁时,其它的写锁和读锁都会阻塞;其实可以看出读写锁,维护了一对锁,一个写锁,其实是个排他锁,一个读锁,是
一、ReentrantLock简介ReentrantLock重入锁,顾名思义,就是支持重入的锁,它表示能够支持一个线程对资源的重复加锁;我们之前学习过Synchronized锁,它也是支持重入的一种锁,参考我的另一篇Synchronized锁的实现原理与应用,Synchronized支持隐式的重入锁,比如递归方法,在方法运行时,执行线程在获取到了锁之后仍能连续多次地获取锁;ReentrantLoc
一、什么是同步器同步器是用来构建锁或者其他同步组件的基础框架,它使用一个int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作,它能实现大部分的同步需求。同步器是实现锁的关键,在锁的实现中聚合同步器,利用同步器实现锁的语义。可以这样理解二者的关系:锁是面向使用者的,它定义了使用者与锁交互的接口(比如可以允许两个线程的并行访问),隐藏了实现细节;同步器面向的是锁的实现者,它简
一、什么是线程要理解什么线程,我么得先知道什么是进程。在现代操作系统在允许一个程序时,会为其创建一个进行。例如启动eclipse.exe其实就是启动了win系统的一个进程。现代操作系统调度的最小单元就是线程,也叫轻量级进程,在一个进程里面包含多个线程,这些线程都有各自的计数器、堆栈等,并且能够共享内存变量。例如我们启动了一个eclipse进程,我们运行在其中的程序就可以理解为线程。二、为什么要使用
1.volatile的定义Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致性地更新,线程应该确保通过排他锁单独获取这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile关键字,Java线程内存模型确保所有线程看到这个变量值的一致性。2.volatile的实现原则1)Lock前缀指令会引起处理器缓存写回内存。Lock前缀指令导
Java并发的原子性和可见性问题。
转载至http://blog.sina.com.cn/s/blog_7d1968e20102xarj.html1.缓存在现代的CPU(大多数)上,所有的内存访问都需要通过层层的缓存来进行。也有些例外,比如,对映射成内存地址的I/O口、写合并内存,这些访问至少绕开这个流程的一部分。CPU的读/写(以及去指令)单元正常情况下甚至都不能直接与内存进行访问-这是物理结构决定的;CPU都没有管脚直接连到内存
简介在JavaSE1.6之前,Synchronized被称为重量级锁.在SE1.6之后进行了各种优化,就出现了偏向锁,轻量锁,目的是为了减少获得锁和释放锁带来的性能消耗.Synchroized的使用(三种形式)(1)对于普通同步方法,锁是当前实例对象.如下代码示例:解释:对于set和get方法来说,都是在方法上使用了同步关键字,所以他们是同步方法,锁的就是当前的实例对象,怎么理解了,看下面的mai
简介(1)背景HashMap死循环:HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry.HashTable效率低下:HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下.因为当一
Jdk1.8数据结构1.8的版本的HashMap采用数组+链表+红黑树的数据结构来存储数据,还是通过hash&(tab.length-1)来确定在数组的位置,不过在数据的存储方面加了一个红黑树,当链表的大于等于8时,并且table的长度大于等于64时,就把这个链树化,不然还是扩容.增加红黑树,是为了提高查找节点的时间.结构如下图所示.基本成员变量capacity容量/***初始容量*/st
Jdk1.7数据结构1.7版本的HashMap采用数组加链表的方式存储数据,数组是用来存储数据的在数组的位置,链表则时用来存放数据的,由于根据hash可能发生碰撞,一个位置会出现多个数据,所以采用链表结构来存储数据,结构如下图所示.基本成员变量capacity数组的长度//当前数组的容量,始终保持2^n,可以扩容,扩容后是当前线程的2倍//1<<4=1*2^41的二进制左移4位stat
Copyright © 2005-2024 51CTO.COM 版权所有 京ICP证060544号