![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
多线程
黑蛋先生
这个作者很懒,什么都没留下…
展开
-
阻塞队列——BlockingQueue
什么是阻塞队列呢?首先,它是一个队列,先进先出。其次,它是被阻塞了的。当阻塞队列为空时,我们从队列从获取元素的操作会被阻塞。当阻塞队列满了时,我们往队列添加元素的操作会被阻塞。我们常用的阻塞队列是BlockQueue:通过BlockQueue,我们不需要关心什么时候需要阻塞线程,什么时候需要唤醒线程,这一切BlockQueue已经帮我们做完了。BlockQueue是一个接口,有七个实现类: ArrayBlockQueue LinkedBlockQueu...原创 2020-11-02 20:59:35 · 239 阅读 · 0 评论 -
CountDownLatch & CyclicBarrier & Semaphore
CountDownLatch什么是CountDownLatch呢?有这样一个场景:一个自习室中有7个人,其中一个是班长,班长的职责就是在其他六个同学离开教室之后,把教室的门锁上。按照上面的逻辑,班长一定是最后一个走的。假设每个人是一个线程,那么怎么控制班长这个线程最后离开教室呢?CountDownLatch就可以解决这个问题:让一些线程阻塞直到另一些线程完成一系列操作才被唤醒。CountDownLatch中有两个主要的方法:countDown()方法:将计数器 -1awa..原创 2020-10-31 20:04:05 · 65 阅读 · 0 评论 -
Collection线程不安全问题
java集合类问题是java基础中的重点,也是面试必问的一个东西,面试官很明确的告诉我们了:就要问你这个,就看你能学多少。List list = new ArrayList();>();当我们执行这条代码的时候,底层做了什么操作呢?我们来看下源码:底层创建了一个空数组,默认的初始容量为10执行add()方法往集合中添加元素的时候,如果集合中的元素超过了10个,那么就会进行扩容,会扩大为原来的1.5倍在单线程环境下,ArrayList是安全的public clas.原创 2020-10-30 20:33:21 · 157 阅读 · 0 评论 -
ABA问题
上一篇写CAS的时候,我列举了它的三个缺点,我们先来复习一下:CAS的缺点: 循环时间长,开销大(主要原因:do{}while()可能无限循环) 只能保证一个共享变量的原子操作,如果是多个共享变量的话,就需要加锁来保证原子性。 会引出ABA问题。 那么这一篇我们来说一下什么是ABA问题ABA问题(狸猫换太子):假设现在有T1和T2两个线程,T1线程的执行时间为10秒,T2线程的执行时间为2秒。程序执行时,T1和T2都从主物理内存中拷贝一份值到自己的工作内..原创 2020-10-29 15:06:13 · 160 阅读 · 0 评论 -
CAS底层原理
CAS(Compare-And-Swap),它是CPU的并发原语。原语属于操作系统的范畴,是由若干条指令组成,用于完成某个功能的一个过程。原语的执行必须是连续的,在执行过程中不允许被中断。也就是说CAS不会造成数据不一致的问题,CAS是线程安全的。CAS的作用是比较当前工作内存中的值和主物理内存中的值,如果相同则更新为我们规定的值,否则继续比较直到工作内存和主物理内存的值一致。我们通常称它为:比较并交换CAS中有两个参数,第一个是预期值,第二个是更改后的值。代码示例:p...原创 2020-10-28 14:54:59 · 480 阅读 · 0 评论 -
对于volatile的理解
volatile是java虚拟机提供的轻量级的同步机制。它有三大特性: 保证可见性 不保证原子性 禁止指令重排 1、保证可见性JVM运行程序的实体是线程,每个线程在创建时JVM都会为其创建一个工作内存(有些地方称为栈空间)。工作内存是每个线程的私有数据区,而java内存模型(JMM)中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问。但问题是:线程对变量的操作(读、取、赋值等)必须在工作内存中进行:首先将变量从主内存拷贝到自己的工作内存,.原创 2020-10-27 16:55:28 · 124 阅读 · 0 评论