
并发
GapaU
这个作者很懒,什么都没留下…
展开
-
(三) 并发容器之 ConcurrentHashMap
HashMap 是线程不安全的集合, 相信只要是参加过面试的同学都会被面试官怼一句 : HashMap 线程安全吗? 为什么?HashMap 的源码就不讲了, 直接看他的孙子 : ConcurrentHashMap (越年轻越厉害) 现在为你揭开 ConcurrentHashMap 的神秘面纱 (本章节参照的是 JDK 8 的源码, 不讨论 JDK 7 的实现)ConcurrentHashMapJDK8 的 ConcurrentHashMap放弃了分段锁, 并且添加了红黑树, 因为定位到节点需要进原创 2020-07-30 20:15:08 · 283 阅读 · 0 评论 -
(二) 并发容器之 CopyOnWriteArraySet
同样, 用 List 的并发容器,当然也存在 Set 的并发容器,J.U.C 包下同样存在 CopyOnWriteArraySetCopyOnWriteArraySetpublic class CopyOnWriteArraySet<E> extends AbstractSet<E> implements java.io.Serializable { // 该类的所有操作由 CopyOnWriteArrayList 完成 private final C原创 2020-07-30 15:48:11 · 215 阅读 · 0 评论 -
(一) 并发容器之 CopyOnWriteArrayList
总所周知, ArrayList 是线程不安全的, 而 Vector 的性能太弱了 (直接锁对象), 基本不会使用, JDK 1.5 在 J.U.C 包中提供了一个并发 List : CopyOnWriteArrarListArrayList, Vector, LinkedList 三者的区别ArrayList : 底层是 Object 数组, 使用线性存储方式特点: 插入慢, 查询快, 线程不安全Vector : 同 ArrayList 一样 继承了 AbstractList 实现了 List原创 2020-07-30 15:11:57 · 180 阅读 · 0 评论 -
老子打烂你的 “线程池“
讲线程池之前, 先来讲讲 Callable 和 阻塞队列为什么有了Runnable, 还要出现 Callable?在没有出现 Callable 之前, Java 线程都有一个缺陷 :在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。而自从Java 1.5开始,就提供了 Callable 和 Future,通过它们可以在任务执行完毕之后得到任务执行结果。Callable 与 Runnable 区别Callable原创 2020-07-13 17:43:57 · 284 阅读 · 0 评论 -
JUC 并发工具类
昨天讲了 ReentrantLock, 今天就来讲讲 CountDownLatch, CyclicBarrier, Semaphore, Exchanger 这几个玩意, 如果你清楚了 ReentrantLock 原理, 那么搞懂这些就像喝水一样简单CountDowLatch (倒计时器)允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。例如, 当一个线程完成 run 方法时, 调用一次 countDown() , 计数器减一, 当计数器值为 0 时, 才能执行 await() 方法原创 2020-07-13 12:05:29 · 179 阅读 · 0 评论 -
看了这篇 ReentrantLock, Doug Lea 都说服
JDK 1.5 是一个大版本更新, 这个版本引入了 枚举, 泛型, 注解 可变参数, 自动装箱, for-each循环, 还引入了基于老年代的垃圾回收器 CMS, 最重要的是引入了并发包 java.util.concurrent , 由著名的并发编程大师 Doug Lea 亲自操刀, 简化了 Java 开发人员在并发编程中需要考虑的种种事情今天, 就来带你瞅瞅 Doug Lea 是如何编写这么牛逼的代码的, 相信看完之后你会对这个人说一句 : 牛B先来看看这玩意与 synchronized 的区别,原创 2020-07-12 16:28:10 · 326 阅读 · 0 评论 -
ThreadLocal 到底是个啥?
/** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread that accesses one (via its * {@code get} or {@code set} method) has its own, independently initialized * copy of the variable原创 2020-07-12 11:07:56 · 215 阅读 · 0 评论 -
CAS 到底是嘛玩意
什么是 CAS ?CAS: (Compare And Swap) 比较和交换, Java 就是通过 CAS 来实现原子操作的 !如何使用 CAS ?CAS 需要三个操作数, 分别是 : 内存地址, 旧的预期值, 准备设置的新值CAS执行时, 对于一个变量 V, 他的旧的预期值为 A, 将要修改的值为 B, 有且仅当 V 符合 A, 处理器才会将 A 换成 B, 否者操作失败.在 JDK 5之后, Java 类库才开始使用 CAS 操作, 该操作被封装在 sun.misc.Unsafe 类中,原创 2020-07-11 16:32:13 · 914 阅读 · 0 评论 -
不懂 volatile, 也敢来面试?
volatile 是 Java 的关键字, 用于修饰变量, 是 Java 提供的最轻量的同步机制, 它有两大作用, 一是保证变量的可见性, 二是禁止 JVM 指令重排在讲 volatile 之前, 我们需要了解一些 CPU 的有关知识CPU一个 CPU 有多个处理器 (多核 CPU) , 以下严格区分处理器和 CPU 的概念一个处理器主要由这些玩意组成 :逻辑运算单元 (ALU) : 用于进行各种算术逻辑运算(如与, 或, 非等), 算术运算(如加减乘除)寄存器 (Regi原创 2020-07-11 15:24:14 · 294 阅读 · 0 评论