J.U.C源码
文章平均质量分 94
想当厨子的程序媛
前期追深度,否则会华而不实,后期追广度,否则会坐井观天;
展开
-
Java J.U.C并发包(2)——synchronized 关键字解析
概述(1)线程安全问题是并发编程中的重点,导致线程不安全的原因主要由两种:一个是存在共享数据;另一个是存在多条线程共同操作共享数据。当多个线程操作共享数据时,我们需要保证同一时刻有且仅有一个线程再操作共享数据,其他线程等待当前线程处理完后再进行操作。 (2)synchronized关键字就是保证在同一时刻,只有一个线程执行某个方法和某个代码块(因为线程和代码块中存在共享数据)另外一个重要的作...原创 2018-04-22 14:31:51 · 278 阅读 · 0 评论 -
并发(4)——AQS和ReentrantLock源码解析
本来是想要看AQS的源码的,然后上网上找了好多,最后还是从ReentrantLock开始一点点看起的~ 今天是周日,今天也要加油鸭,本文有很多参考别人博客的地方,但是也有自己的整理哟~一、AQS原理AQS的全称为:AbstractQueuedSynchronizer,它是在java.util.concurrent.locks下面的类。该类是同步工具的一个基础类,很多类都是通过创建自己的内部...原创 2019-02-01 17:04:04 · 699 阅读 · 0 评论 -
并发(7)——ConcurrentLinkedQueue源码解析
并发包之队列现在我们开始讨论一下并发容器中的队列的实现,队列在并发中经常会被使用,比如AQS中的同步队列、阻塞队列等。现在我们就好好研究一下队列是如何保证线程安全的,同时我们所知道的常用的消费者生产者模式也是通过队列来实现的。同时我们知道Kafka就是一种消息队列。常用的并发队列有阻塞队列和非阻塞队列,阻塞队列使用锁来实现,非阻塞队列使用CAS非阻塞算法实现。我们今天来分析一下Concur...原创 2019-02-01 17:03:37 · 185 阅读 · 0 评论 -
并发(8)——ArrayBlockingQueue 源码解析(有界阻塞队列)
并发包Queue接口BlockingQueue接口ArrayBlockingQueue类图结构1. ArrayBlockingQueue类中重要的成员变量items : 用来存放队列中的元素takeIndex:出队元素的下标putIndex:入队元素的下标count:统计队列元素的个数ReentrantLock:用来保证线程安全的锁Condition notEmpt...原创 2019-02-01 17:03:30 · 258 阅读 · 0 评论 -
并发(5)——ReentrantReadWriteLock源码解析
针对获取readLock的线程的获取次数需要分3种情况线程的tid及获取次数count存放在 HoldCounter里面,最后放在ThreadLocal中.从cachedHoldCounter获取存入的信息注意:这里不是有一个ThreadLocl,为什么还需要使用cacheHolderCounter呢?因为:多数情况下,在进行线程 acquire readLock后不久就会进行相...原创 2019-02-01 17:05:24 · 316 阅读 · 0 评论 -
并发(9)——LinkedBlockingQueue 源码解析
总结LinkedBlockingQueue 是一个单向链表、范围任意的、FIFO阻塞队列;访问和移除元素在队头,添加元素在队尾。LinkedBlockingQueue 与 ArrayBlockingQueue 的区别参考并感谢[1] https://blog.csdn.net/javazejian/article/details/77410889...原创 2019-02-01 17:03:21 · 319 阅读 · 0 评论 -
并发()——PriorityBlockingQueue源码解析
一、PriorityBlockingQueue类图结构PriorityBlockingQueue类中的成员变量与成员方法介绍:queue数组:用来存放队列元素size:用来存放队列元素的个数allocationSpinLockOffset:用来在扩容队列时候做cas,目的是保证只有一个线程可以进行扩容。comparator:由于这是一个优先级队列,所以有一个比较器comparato...原创 2019-02-01 17:06:25 · 165 阅读 · 0 评论 -
并发()——SynchronousQueue源码解析
概述SynchronousQueue 实际上不是一个真正的队列,因为它不会为队列中的元素维护存储空间。与其他队列不同的是,它维护一组线程,这些线程在等待着把元素加入或移除队列。SynchronousQueue不像ArrayBlockingQueue或者LinkedBlockingQueue,你不能调用peek()方法来看队列中是否有数据元素,因为数据元素只有当你试图取走的时候才可能存在,不取...原创 2019-02-01 17:06:35 · 186 阅读 · 0 评论 -
并发()——CopyOnWriteArrayList与CopyOnWriteArraySet源码解析
CopyOnWriteArrayList简介Copy-On-Write:写时复制。通俗的理解就是当我们往一个容器里面添加元素的时候,不直接往当前容器里添加,而是先将当前容器进行copy,复制出一个新的容器,然后向新的容器里天极爱元素,添加完元素后,再将原容器的引用指向新的容器。这样做的好处是我们可以对CopyOnWrite容器进行并发的读,而不需要加锁,以为当前容器不会添加任何元素。所以Copy...原创 2019-02-01 17:06:44 · 183 阅读 · 0 评论 -
并发(3)——Happens-before
原子性原子性是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。有序性在并发时,程序的执行可能就会出现乱序...原创 2019-02-01 17:02:44 · 132 阅读 · 0 评论 -
并发(2)—— 线程的6种状态
什么是线程线程是进程内的执行单元线程的6种状态初始(New):新创建一个线程对象,但还没有调用start()方法运行(Runnable):java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”线程对象创建之后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就...原创 2019-02-01 17:00:46 · 721 阅读 · 0 评论 -
Java J.U.C并发包(3)——从JVM的角度来理解JMM
Java内存区域Java内存区域是真实存在的,是JVM再运行程序期间将自动管理的内存划分为5个不同的区域。Java内存区域划分图如下所示:线程数据私有区域:随着线程产生和消亡,不需要过多考虑内存回收问题,在编译时确定所需内存大小方法区: 方法区属于线程共享的数据区域,主要用于存储已被虚拟机加载的类信息:常量、静态变量、即时编译器编译后的代码等数据。当方法区无法满足内存分配需求时...原创 2018-04-22 20:37:02 · 607 阅读 · 0 评论 -
Java J.U.C并发包(4) —— 第一章:并发简介
这里会记录 《Java Concurrency in Practice》(java并发编程实战)的所有知识点哟~1.1 并发简史操作系统的出现使得计算机每次能运行多个程序,并且不同的程序都在单独的进程中运行。之所以在计算机中假如操作系统来实现多个程序的同时执行,主要是基于以下原因:资源利用率。在某些情况下,程序必须等待某个外部操作执行完成,例如输入操作或者输出操作等,而在...原创 2018-04-23 18:49:00 · 186 阅读 · 0 评论 -
Java J.U.C并发包(5) —— 第二章:线程安全性
这里会记录 《Java Concurrency in Practice》(java并发编程实战)的所有知识点哟~要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变状态的访问。对象的状态指存储在状态变量(如实例或静态域)中的数据。对象的状态也可能包括其他依赖对象的域。如HashMap的状态不仅仅存储在HashMap对象本身,还存储在许多Map.Entry对象中...原创 2018-04-23 21:28:40 · 171 阅读 · 0 评论 -
Java J.U.C并发包(7) —— ThreadLocal类
这里会记录 《Java Concurrency in Practice》(java并发编程实战)的所有知识点哟~因为ThreadLocal类比较重要,所以单独写一个博文来介绍这个类1. 什么是ThreadLocalThreadLocal是一个关于创建线程局部变量的类一般情况下,我们创建的变量时可以被任何一个线程访问并且修改的。而使用ThreadLocal创建的变量只能被当前...原创 2018-04-25 13:24:13 · 297 阅读 · 0 评论 -
Java J.U.C并发包(6) —— 第三章:对象的共享
这里会记录 《Java Concurrency in Practice》(java并发编程实战)的所有知识点哟~ 本章主要内容: 1. 可见性 2. 发布与逸出 3. 线程封闭 4. 不变性 5. 安全发布第2章介绍的是如何通过同步来避免多线程在同一时刻访问相同的数据,接下来的这一章将介绍如何共享和发布对象,从而使他们能够安全地由多个线程同时访问。这...原创 2018-04-25 15:45:51 · 230 阅读 · 0 评论 -
Java J.U.C并发包(1)—— J.U.C并发包综述
J.U.C包类图 图片来源:http://www.blogjava.net/xylz/archive/2010/06/30/324915.htmlJava多线程相关类的实现都在Java的并发包中,该包的位置是:jdk8\java\util\concurrent。该包主要包含如下五大部分:(1) atomic包:主要提供原子变量类相关功能,是构建非阻塞算法的基础(2) Locks...原创 2018-04-21 18:42:14 · 1028 阅读 · 0 评论 -
高并发面试总结
1. 什么是进程进程是指运行中的应用程序,每个进程都有自己独立的地址空间(内存空间)。 比如用户点击桌面的IE浏览器,就启动了一个进程,操作系统就会为该进程分配独立的地址空间。当用户再次点击左边的IE浏览器,又启动了一个进程,操作系统将为新的进程分配新的独立的地址空间。目前操作系统都支持多进程。2. 什么是线程进程是表示自愿分配的基本单位。而线程则是进程中执行运算的最小单位,即执...原创 2018-07-07 18:28:58 · 12707 阅读 · 5 评论 -
并发()——ConcurrentHashMap 源码解析
HashMap、HashTable与ConcurrentHashMap的区别HashMap是线程不安全的。HashTable是线程安全的。HashTable的线程安全是采用在每个方法上面都添加上了 synchronized 关键字来修饰,即 Hashtable 是针对整个 table 的锁定。所有访问 HashTable 的线程都必须竞争同一把锁。当一个线程访问 HashTable 的...原创 2019-02-21 21:56:11 · 480 阅读 · 0 评论