![](https://img-blog.csdnimg.cn/20190918135101160.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发
文章平均质量分 93
线程
晓寒风骤
这个作者很懒,什么都没留下…
展开
-
Java多线程(二十): J.U.C 之LongAdder:LongAdder原理
前面介绍了Java中的一些原子类,但是基本都是通过CAS来实现原子性操作,白白浪费CPU资源。JDK8中新增了一个原子性递增或者递减类LongAdder用来克服高并发下使用AtomicLong的缺点。LongAdder的思路是把一个变量分解为多个变量,让同样多的线程去竞争多个资源。如图所示:使用LongAdder时,内部维护了多个Cell变量,每个Cell里面有一个初始值为0的long型变量,这样同时争取一个变量的线程就变少了,而是分散成对多个变量的竞争,减少了失败次数。如果竞争某个Cell变量失败,它不原创 2021-01-22 13:42:22 · 170 阅读 · 0 评论 -
Java多线程(十九): J.U.C 之线程池:ThreadPoolExecutor
作为Executor框架中最核心的类,ThreadPoolExecutor代表着鼎鼎大名的线程池,它给了我们足够的理由来弄清楚它。下面我们就通过源码来一步一步弄清楚它。内部状态线程有五种状态:新建,就绪,运行,阻塞,死亡,线程池同样有五种状态:Running, SHUTDOWN, STOP, TIDYING, TERMINATED。 private final Ato...原创 2020-04-02 14:21:44 · 189 阅读 · 0 评论 -
Java多线程(十八): J.U.C 之阻塞队列LinkedBlockingDeque
前面的BlockingQueue都是单向的FIFO队列,而LinkedBlockingDeque则是一个由链表组成的双向阻塞队列,双向队列就意味着可以从对头、对尾两端插入和移除元素,同样意味着LinkedBlockingDeque支持FIFO、FILO两种操作方式。LinkedBlockingDeque是可选容量的,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为Integer...原创 2020-04-02 14:19:41 · 142 阅读 · 0 评论 -
Java多线程(十七): J.U.C 之阻塞队列SynchronousQueue
作为BlockingQueue中的一员,SynchronousQueue与其他BlockingQueue有着不同特性:SynchronousQueue没有容量。与其他BlockingQueue不同,SynchronousQueue是一个不存储元素的BlockingQueue。每一个put操作必须要等待一个take操作,否则不能继续添加元素,反之亦然。 因为没有容量,所以对应 peek, co...原创 2020-04-02 14:18:34 · 162 阅读 · 0 评论 -
Java多线程(十六): J.U.C 之阻塞队列DelayQueue
DelayQueue是一个支持延时获取元素的无界阻塞队列。里面的元素全部都是“可延期”的元素,列头的元素是最先“到期”的元素,如果队列里面没有元素到期,是不能从列头获取元素的,哪怕有元素也不行。也就是说只有在延迟期到时才能够从队列中取元素。DelayQueue主要用于两个方面:缓存:清掉缓存中超时的缓存数据 任务超时处理DelayQueueDelayQueue实现的关键主要有如下几...原创 2020-04-02 14:17:37 · 145 阅读 · 0 评论 -
Java多线程(十五): J.U.C 之阻塞队列PriorityBlockingQueue
我们知道线程Thread可以调用setPriority(int newPriority)来设置优先级的,线程优先级高的线程先执行,优先级低的后执行。而前面介绍的ArrayBlockingQueue、LinkedBlockingQueue都是采用FIFO原则来确定线程执行的先后顺序,那么有没有一个队列可以支持优先级呢? PriorityBlockingQueue 。PriorityBlockin...原创 2020-04-02 14:16:52 · 128 阅读 · 0 评论 -
Java多线程(十四): J.U.C 之阻塞队列ArrayBlockingQueue
1. 简介ArrayBlockingQueue,一个由数组实现的有界阻塞队列。该队列采用 FIFO 的原则对元素进行排序添加的。ArrayBlockingQueue 为有界且固定,其大小在构造时由构造函数来决定,确认之后就不能再改变了。ArrayBlockingQueue 支持对等待的生产者线程和使用者线程进行排序的可选公平策略,但是在默认情况下不保证线程公平的访问,在构造时可以选择公...原创 2020-04-02 14:15:50 · 190 阅读 · 0 评论 -
Java多线程(十三): 深入分析 ThreadLocal
ThreadLocal是什么?ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢?API是这样介绍它的:This class provides thread...原创 2020-04-01 17:19:52 · 161 阅读 · 0 评论 -
Java多线程(十二):J.U.C 之 Condition
在没有 Lock 之前,我们使用synchronized来控制同步,配合 Object 的#wait()、#notify()等一系列方法可以实现等待 / 通知模式。在 Java SE 5 后,Java 提供了 Lock 接口,相对于synchronized而言,Lock 提供了条件 Condition ,对线程的等待、唤醒操作更加详细和灵活。下图是 Condition 与 Object...原创 2020-04-01 17:10:57 · 274 阅读 · 0 评论 -
Java多线程(十一):J.U.C 之并发容器ConcurrentSkipListMap/ConcurrentLinkedQueue
到目前为止,我们在Java世界里看到了两种实现key-value的数据结构:Hash、TreeMap,这两种数据结构各自都有着优缺点。Hash表:插入、查找最快,为O(1);如使用链表实现则可实现无锁;数据有序化需要显式的排序操作。 红黑树:插入、查找为O(logn),但常数项较小;无锁实现的复杂性很高,一般需要加锁;数据天然有序。然而,这次介绍第三种实现key-value的数据结构:Sk...原创 2020-04-01 16:29:57 · 380 阅读 · 0 评论 -
Java多线程(十):J.U.C 之并发容器ConcurrentHashMap
HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近100%。为了解决该问题,提供了Hashtable和Collections.synchronizedMap(hashMap)两种解决方案,但是这两种方案都是对读写加锁,独占式,一个线程在读时其他线程必须等待,吞吐量较低,性能较为低下。故而Doug Lea大神给我...原创 2020-04-01 16:27:32 · 340 阅读 · 0 评论 -
Java多线程(九):J.U.C 之CyclicBarrier/CountDownLatch/Semaphore
1. 简介CyclicBarrier ,一个同步辅助类,在 AP I中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点(Common Barrier Point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 Barrier 在释放等待线程后可以重用,所以称它为循环( Cyclic ) 的 屏障( Barrie...原创 2020-04-01 16:20:10 · 276 阅读 · 0 评论 -
Java多线程(八):深入分析 CAS
1. 概述CAS ,Compare And Swap ,即比较并交换。Doug Lea 大神在实现同步组件时,大量使用CAS 技术,鬼斧神工地实现了Java 多线程的并发操作。整个 AQS 同步组件、Atomic 原子类操作等等都是基 CAS 实现的,甚至 ConcurrentHashMap 在 JDK 1.8 的版本中,也调整为 CAS +synchronized。可以说,CAS 是整个...原创 2020-04-01 16:15:37 · 189 阅读 · 0 评论 -
Java多线程(七):J.U.C 之 ReentrantLock和ReentrantReadWriteLock
1. 简介ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是 ReentrantLock 提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。API 介绍如下:一个可重入的互斥锁定 Lock,它具有与使用synchronized方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义...原创 2020-04-01 16:12:36 · 299 阅读 · 0 评论 -
Java多线程(六):J.U.C 之 AQS
ReentrantLock 锁是用来控制多个线程访问共享资源的方式,一般来说,一个锁能够防止多个线程同时访问共享资源, 在Lock接口出现之前,Java应用程序只能依靠synchronized关键字来实现同步锁的功能,在java5以后,增加了JUC 的并发包且提供了Lock接口用来实现锁的功能,它提供了与synchroinzed关键字类似的同步功能,只是它比 synchronized更灵活,...原创 2019-01-11 10:17:16 · 321 阅读 · 0 评论 -
Java多线程(五):Volatile解析
VolatileVolatile写 当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。Volatile读 当读一个volatile变量时,JMM会把该线程对应的本地内存置为无效。线程接下来从主内存中读取共享变量。 下面对volatile写和volatile读的内存语义做一个总结: 线程A写一个volatile变量,实质上是线程A...原创 2019-01-11 10:04:08 · 563 阅读 · 0 评论 -
Java多线程(三):Thread中的静态方法
Thread类中的静态方法Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程"。为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法:1、currentThread()currentThread()方法返回的是对当前正在执行线程对象的引用。看一个重要的例子,然后得出结论:public...原创 2019-03-15 16:23:49 · 454 阅读 · 0 评论 -
Java多线程(二):Thread中的实例方法
Thread类中的方法调用方式:学习Thread类中的方法是学习多线程的第一步。在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别:1、this.XXX()这种调用方式表示的线程是线程实例本身2、Thread.currentThread.XXX()或Thread.XXX()上面两种写法是一样的意思。这种调用方式表示的...原创 2019-03-15 16:15:31 · 200 阅读 · 0 评论 -
Java多线程(一):进程与线程概述
进程和线程谈到多线程,就得先讲进程和线程的概念。进程进程可以理解为受操作系统管理的基本运行单元。360浏览器是一个进程、WPS也是一个进程,正在操作系统中运行的".exe"都可以理解为一个进程线程进程中独立运行的子任务就是一个线程。像QQ.exe运行的时候就有很多子任务在运行,比如聊天线程、好友视频线程、下载文件线程等等。为什么要使用多线程如果使用得当,线程可...原创 2019-03-15 16:14:17 · 153 阅读 · 0 评论 -
Java多线程(四):Synchronized实现原理
Synchronized1.synchronized的三种应用方式 1.修饰实例方法,作用于当前实例加锁,进入同步代码前要获得当前实例的锁 2. 静态方法,作用于当前类对象加锁,进入同步代码前要获得当前类对象的锁 3.修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。2.synchronized括号后面的对象 synchronized扩后...转载 2019-01-11 10:06:21 · 681 阅读 · 0 评论 -
三个线程交替顺序打印ABC
题目描述建立三个线程A、B、C,A线程打印10次字母A,B线程打印10次字母B,C线程打印10次字母C,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印。5种方法使用synchronized, wait和notifyAll使用Lock->ReentrantLock 和 state标志使用Lock->ReentrantLock 和Conditio...原创 2020-04-01 10:00:12 · 376 阅读 · 0 评论