Java并发编程
文章平均质量分 95
java 多线程相关,JUC
demon7552003
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
DelayQueue
概述DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed 元素。DelayQueue阻塞队列在我们系统开发中也常常会用到,例如:缓存系统的设计,缓存中的对象,超过了空闲时间,需要从缓存中移出;任务调度系统,能够准确的把握任务的执行时间。我们可能需要通过线程处理很多时间上要求很严格的数据,如果使用普通的线程,我们就需要...原创 2018-12-09 14:42:17 · 250 阅读 · 0 评论 -
ReentrantLock源码
Sync abstract static class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = -5179523762034025860L; abstract void lock(); /** ...原创 2019-05-26 10:03:28 · 270 阅读 · 0 评论 -
ReentrantReadWriteLock源码解析
概述 ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时Reen...原创 2019-05-26 17:43:13 · 599 阅读 · 0 评论 -
Java并发包--阻塞队列(BlockingQueue)
阻塞队列介绍在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他...原创 2019-06-01 10:31:27 · 355 阅读 · 0 评论 -
LinkedBlockingQueue源码
目录介绍数据结构链表节点属性方法实现offerpollpeekputtakeenqueue,dequeuesignalfullLock注意参考介绍java.util.concurrent.LinkedBlockingQueue 是一个基于单向链表的、范围任意的(其实是有界的)、FIFO 阻塞队列。访问与移除操作是在队头进行,添加操...原创 2019-06-01 10:32:32 · 317 阅读 · 0 评论 -
ArrayBlockingQueue源码
目录介绍数据结构方法实现offer,poll,peekput,takeenqueue,dequeue注意参考介绍是一个用数组实现的有界阻塞队列,此队列按照先进先出(FIFO)的原则对元素进行排序。支持公平锁和非公平锁。【注:每一个线程在获取锁的时候可能都会排队等待,如果在等待时间上,先获取锁的线程的请求一定先被满足,那么这个锁就是公平的。反之,这个锁就是不公...原创 2019-06-01 11:01:47 · 187 阅读 · 0 评论 -
FutureTask源码
介绍FutureTask是一种异步任务(或异步计算),举个栗子,主线程的逻辑中需要使用某个值,但这个值需要负责的运算得来,那么主线程可以提前建立一个异步任务来计算这个值(在其他的线程中计算),然后去做其他事情,当需要这个值的时候再通过刚才建立的异步任务来获取这个值,有点并行的意思,这样可以缩短整个主线程逻辑的执行时间。 与1.6版本不同,1.7的FutureTask不再基于AQS来构建,而是...原创 2019-06-12 22:25:50 · 235 阅读 · 0 评论 -
PriorityBlockingQueue源码
介绍一个支持线程优先级排序的无界队列,默认自然序进行排序,也可以自定义实现compareTo()方法来指定元素排序规则,不能保证同优先级元素的顺序。队列中的元素必须是可比较的,即实现Comparable接口,或者在构建函数时提供可对队列元素进行比较的Comparator对象。不可以放null,会报空指针异常。数据结构PriorityBlockingQueue内部使用heap做为存储结构...原创 2019-06-01 12:49:07 · 367 阅读 · 0 评论 -
DelayQueue源码
介绍一个实现PriorityBlockingQueue实现延迟获取的无界队列,在创建元素时,可以指定多久才能从队列中获取当前元素。只有延时期满后才能从队列中获取元素。(DelayQueue可以运用在以下应用场景:1.缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。2.定时任务...原创 2019-06-01 13:58:20 · 304 阅读 · 0 评论 -
LinkedBlockingDeque源码
介绍一个由链表结构组成的双向阻塞队列。队列头部和尾部都可以添加和移除元素,多线程并发时,可以将锁的竞争最多降到一半。相比于其他阻塞队列,LinkedBlockingDeque多了addFirst、addLast、peekFirst、peekLast等方法,以first结尾的方法,表示插入、获取获移除双端队列的第一个元素。以last结尾的方法,表示插入、获取获移除双端队列的最后一个元素。...原创 2019-06-01 20:27:57 · 268 阅读 · 0 评论 -
Java:ThreadPoolExecutor解析续--Executors
简介Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务的线程相当于消费者,并用Runnable来表示任务,Executor的实现还提供了对生命周期的支持,以及统计信息收集,应用程序管理机制和性能监视等机制。Executors:提供了一系列静态...原创 2019-06-15 11:50:20 · 174 阅读 · 0 评论 -
源码分析-SynchronousQueue
JUC SynchonousQueue的源码分析SynchronousQueue作为阻塞队列的时候,对于每一个take的线程会阻塞直到有一个put的线程放入元素为止,反之亦然。在SynchronousQueue内部没有任何存放元素的能力。所以类似peek操作或者迭代器操作也是无效的,元素只能通过put类操作或者take类操作才有效。通常队列的第一个元素是当前第一个等待的线程。如果没有线程阻塞在该队列则poll会返回null。从Colle...转载 2019-06-15 16:30:42 · 9810 阅读 · 1 评论 -
非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价锁是用来做并发最简单的方式,当然其代价也是最高的。内核态的锁的时候需要操作系统进行一次上下文切换,加锁、释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放。在上下文切换的时候,cpu之前缓存的指令和数据都将失效,对性能有很大的损失。操作系统对多线程的锁进行判断就像两姐妹在为一个玩具在争吵,然后操作系统就是能决定他们谁能拿到玩具的父母,这是很慢的。用户态...转载 2019-06-15 20:44:08 · 173 阅读 · 0 评论 -
JDK并发包中的接口(抽象类)的定义
Locks1、AbstractOwnableSynchronizerpublic abstract class AbstractOwnableSynchronizer implements java.io.Serializable { protected AbstractOwnableSynchronizer() { } private transient Th...原创 2019-07-12 20:32:33 · 191 阅读 · 0 评论 -
Java:ThreadPoolExecutor解析
目录功能介绍线程池相关类图源码解析基本概念字段域常量线程构造重要字段线程控制重要字段方法执行任务ThreadPoolExecutor的关闭功能介绍线程池,顾名思义一个线程的池子,池子里存放了很多可以复用的线程,如果不用线程池类似的容器,每当我们需要创建新的线程时都需要去new Thread(),用完之后就被回收了,线程的启动回收都需要用户态...原创 2019-06-13 22:45:52 · 356 阅读 · 0 评论 -
这10道Java面试题!大部分的人回答不出来
1.为什么等待和通知是在 Object 类而不是 Thread 中声明的?2.为什么Java中不支持多重继承?3.为什么Java不支持运算符重载?4.为什么 String 在 Java 中是不可变的?5.为什么 char 数组比 Java 中的 String 更适合存储密码?6.如何使用双重检查锁定在 Java 中创建线程安全的单例?7. 编写 Java 程序时, 如何在...转载 2019-08-17 11:12:55 · 942 阅读 · 0 评论 -
CyclicBarrier详解
CyclicBarrier介绍CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier),类似于CountDownLatch也是个计数器,不同的是CyclicBarrier要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活。之所以用循环修饰,是因为在所有的线程释放彼此之后,这...原创 2019-05-26 09:20:17 · 1439 阅读 · 0 评论 -
JDK1.8并发包中的类
Lockjava.util.concurrent.locks.AbstractOwnableSynchronizer 抽象类:java.util.concurrent.locks.AbstractQueuedLongSynchronizer AbstractQueuedSynchronize的64位实现,完全一致。java.util.concurre...原创 2019-06-11 22:27:38 · 1829 阅读 · 0 评论 -
AtomicStampedReference实现
AtomicStampedReference解决ABA问题AtomicStampedReference与AtomicReference差异参考:无锁的对象引用:AtomicReference带有时间戳的对象引用:AtomicStampedReferenceAtomicStampedReference的实现Pair类Pair类存储原子对象以及时间戳 private...原创 2019-05-25 16:32:16 · 554 阅读 · 0 评论 -
走进并行世界
并行原创 2017-06-04 16:35:22 · 336 阅读 · 0 评论 -
JDK并发包-同步控制
synchronized关键字synchronized关键字用来实现线程间的同步。它的工作是对同步的代码加锁,使得每次只有一个线程进入同步块。synchronized关键字用法:指定加锁对象:对给定对象加锁,进入同步块前要获得给定对象的锁static xxx instance = new xxx(); synchronized(instance){ i++;}...原创 2019-07-12 20:34:44 · 203 阅读 · 0 评论 -
Java内存模型
Java内存模型主内存与工作内存Java内存模型规定了所有变量都存储在主内存中,每个工作线程有自己的工作内存,线程的工作内存保存了被线程使用的变量的主内存副本拷贝,线程对变量的所有操作都在工作内存中进行,不能对主内存变量进行操作。不同线程之间也无法访问其他线程的工作内存中的变量。线程间变量值的传递都需要经过主内存。注意:如果变量是reference类型,它引用的对象在Java堆中被...原创 2019-03-16 12:42:13 · 185 阅读 · 0 评论 -
Java中断机制
如果程序需要停止正在运行的线程,如果直接stop线程,则有可能导致程序运行不完整,因此Java提供了中断机制。中断是一种协作机制Java的中断是一种协作机制,也就是说通过中断并不能直接STOP另外一个线程,而需要被中断的线程自己处理中断,即仅给了另一个线程一个中断标识,由线程自行处理。中断标识每个Java线程都有一个Boolean类型的属性用于表示中断标识。Java线程提供了3个方...原创 2019-04-04 14:05:32 · 1998 阅读 · 0 评论 -
Java线程
守护线程Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)用户线程即运行在前台的线程,而守护线程是运行在后台的线程。守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,比如垃圾回收线程就是一个守护线程。当VM检测仅剩一个守护线程,而用户线程都已经退出运行时,VM就会退出,因为没有如果没有了被守护者,也就没...原创 2019-04-04 14:39:26 · 291 阅读 · 0 评论 -
Java线程阻塞原语-LockSupport
在Java6引入LockSupport以前,线程挂起和唤醒要通过Object的wait和notify/notifyAllfangAll实现,但后者必须要在同步块里调用,且notify必须要在wait之后调用才行否则会导致线程阻塞。LockSupport比Object的wait/notify有两大优势:LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步对象了,...原创 2019-04-04 16:13:33 · 499 阅读 · 0 评论 -
ConditionObject源码
介绍Condition是在JDK1.5中才出现的,它可以替代传统的Object中的wait()、notify()和notifyAll()方法来实现线程间的通信,使线程间协作更加安全和高效。Condition是一个接口,它的定义如下:public interface Condition { void await() throws InterruptedException; ...原创 2019-05-19 13:20:41 · 324 阅读 · 0 评论 -
AbstractQueuedSynchronizer源码解析
目录关于AbstractQueuedSynchronizer基本数据结构节点结构同步队列结构实现子类需要实现的方法独占模式实现独占模式同步队列示意共享模式共享模式同步队列示意:关于AbstractQueuedSynchronizerJDK1.5之后引入了并发包java.util.concurrent,里面包含了很多并发控制锁类,其核心是:Abs...原创 2019-05-11 13:50:11 · 628 阅读 · 2 评论 -
锁的优化及注意事项
Java高并发程序设计第4章目录一、提高锁性能的几点建议1.1 减小锁持有时间1.2 减小锁粒度1.3 读写分离锁来替换独占锁1.4 锁分离1.5 锁粗化二、Java虚拟机对锁优化所做的努力2.1 偏向锁2.2 轻量级锁2.3 自旋锁2.4 锁清除三、人手一支笔:ThreadLocal四、无锁1.与众不同的并发策略:比较交换(CAS)...原创 2019-05-25 10:20:48 · 490 阅读 · 0 评论 -
ThreadLocal以及增强
多线程的本质就是增加任务的并发,提高效率。但是又要控制任务不错乱,可以通过锁来控制资源的访问。除了控制资源的访问外,我们可以通过增加资源来保证所有对象的线程安全。比如100个人填写个人信息表,如果只有一支笔,那么大家都得排队,如果准备100支笔,这样人手一支笔,就可以很快完成填写信息。如果说锁是第一种思路,ThreadLocal就是第二种思路。ThreadLocal的简单实用从Th...原创 2019-05-25 09:03:33 · 396 阅读 · 0 评论 -
CountDownLatch应用及原理
正如每个Java文档所描述的那样,CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包...原创 2019-05-25 13:32:49 · 246 阅读 · 0 评论 -
Semaphore应用及原理
信号量Semaphore的介绍我们以一个停车场运作为例来说明信号量的作用。假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了三辆车,看门人允许其中它们进入进入,然后放下车拦。以后来的车必须在入口等待,直到停车场中有车辆离开。这时,如果有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开一辆,则又可以放入一辆,如此往复。在这个停车场系统中,车位是公共资源,每辆车好比...原创 2019-05-25 14:55:07 · 415 阅读 · 0 评论 -
深入解析Java AtomicInteger 原子类型
深入解析Java AtomicInteger 原子类型深入解析Java AtomicInteger原子类型在进行并发编程的时候我们需要确保程序在被多个线程并发访问时可以得到正确的结果,也就是实现线程安全。线程安全的定义如下:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么这个...转载 2019-05-25 15:07:00 · 208 阅读 · 0 评论 -
AtomicIntegerArray类详解
介绍java.util.concurrent.atomic.AtomicIntegerArray类提供了可以以原子方式读取和写入的底层int数组的操作,还包含高级原子操作。 AtomicIntegerArray支持对底层int数组变量的原子操作。 它具有获取和设置方法,如在变量上的读取和写入。 也就是说,一个集合与同一变量上的任何后续get相关联。 原子compareAndSet方法也具有这些...原创 2019-05-25 15:35:09 · 957 阅读 · 0 评论 -
AtomicIntegerFieldUpdater字段原子更新类
前面讲的两个AtomicInteger和AtomicIntegerArray,这两个都是在最初设计编码时候就已经考虑到了需要保证原子性。但是往往有很多情况就是,由于需求的更改,原子性需要在后面加入,类似于我不要求你这整个类操作具有原子性,我只要求你里面一个字段操作具有原子性。没错,concurrent.atomic包下AtomicIntegerFieldUpdater就是这个作用的。Atomi...转载 2019-05-25 15:59:12 · 613 阅读 · 0 评论 -
Java并行程序基础
java并行基础原创 2017-06-04 16:13:09 · 321 阅读 · 0 评论
分享