
JUC包
文章平均质量分 83
liu1002880404
这个作者很懒,什么都没留下…
展开
-
HashMap面试题
文章目录综述HashMap什么是拉链法为什么不一开始选择红黑树呢?综述HashMap在实际开发过程中是使用频率最高的用于映射(键值对)处理的数据类型。在JDK1.8中对HashMap底层的底层实现进行了大幅度地优化,比如引入红黑树的数据结构和扩容的优化等等。HashMap什么是拉链法在JDK 1.8 的 HashMap 和 ConcurrentHashMap 都有这样一个同样的特点,那就是最开始的Map是空的,因为里面没有任何元素,往里放元素时会计算 hash值,计算之后,第 1 个 value原创 2021-07-04 16:44:10 · 4428 阅读 · 2 评论 -
JUC 锁 lock包
Condition与Lock的方法两个接口condition 方法void await() Causes the current thread to wait until it is signalled orinterrupted. boolean await(longtime,TimeUnitunit) Causes the current thread to wait until it is signalled or interrupted, or...原创 2021-06-23 15:52:44 · 126 阅读 · 0 评论 -
JUC集合: 一篇学会ConcurrentHashMap
JDK1.7之前的ConcurrentHashMap使用分段锁机制实现,JDK1.8则使用数组+链表+红黑树数据结构和CAS原子操作实现ConcurrentHashMap;本文将分别介绍这两种方式的实现方案及其区别。原创 2021-06-20 11:28:53 · 261 阅读 · 0 评论 -
JUC锁之AbstractQueuedSynchronizer AQS源码
类的继承关系AbstractQueuedSynchronizer继承自AbstractOwnableSynchronizer抽象类,并且实现了Serializable接口,可以进行序列化。原创 2021-06-20 10:42:17 · 177 阅读 · 0 评论 -
JUC集合: CopyOnWriteArrayList详解
CopyOnWriteArrayList是ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的拷贝来实现的。COW模式的体现。原创 2021-06-19 23:16:34 · 343 阅读 · 0 评论 -
JUC之阻塞队列
一、什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:当队列为空时,获取元素的线程会等待队列变为非空。二、为什么需要阻塞队列好处是我们不需要关心什么时候需要阻塞线程,什么时候唤醒线程,不需要控制wait和notify等。三、阻塞队列的应用场景阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里原创 2021-06-19 22:40:11 · 313 阅读 · 0 评论 -
ForkJoinPool 分支/合并框架
就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总。JoinFork/Join 框架与线程池的区别采用 “工作窃取”模式(work-stealing):当执行新的任务时它可以将其拆分分成更小的任务执行,并将小任务加到线程队列中,然后再从一个随机线程的队列中偷一个并把它放在自己的队列中。相对于一般的线程池实现, fork/join框架的优势体现在对其中包含的任务的处理方式上.在一般的线程池中, 如果一个线程正在执行原创 2021-06-19 22:23:26 · 357 阅读 · 0 评论 -
JUC工具类之CountDownLatch、CyclicBarrier、Semaphore
CountDownLatch 是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程执行完后再执行。CountDownLatch 在 JDK 1.5 被引入。 存在于 java.util.concurrent 包下。 例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有框架服务之后执行...原创 2020-03-31 22:19:05 · 263 阅读 · 0 评论 -
多线程8锁的现象和解释
现象上代码import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class Phone { private static Lock lock = new ReentrantLock(); public static void sendEmail() { lock.lock(); try原创 2021-06-19 21:20:39 · 111 阅读 · 0 评论 -
多线程卖票
简单实现(synchronized)/** * 卖票 企业级套路 + 模板 * 1. 在高内聚低耦合的前提下: 线程 操作(对外暴露的调用方法) 资源类 * 高内聚: 资源类对外暴露的功能只在自己身上实现 低耦合: 调用者和 资源类之间并无关系 */public class SaleTicket { public static void main(String[] args) { // 资源类 Ticket ticket = new Tick原创 2021-06-19 21:14:58 · 116 阅读 · 0 评论 -
volatile、atomic、final、ThreadLocal概述
volatile域volatite只保证线程在“加载数据阶段”加载的数据是最新的,并不能保证线程安全。一个线程执行的过程有三个阶段:加载(复制)主存数据到操作栈 --> 对操作栈数据进行修改 --> 将操作栈数据写回主存volatite关键字,让编译器不去优化代码使用缓存等,以保证线程在“加载数据阶段”加载的数据都是最新的比如:某一时刻i=6是最新的值,volatile保证线程A,B都同时加载了这个最新的值,然后A执行i(A)+1=7,然后将7写回主存,B也执行i(B)+1..原创 2021-06-19 20:19:45 · 255 阅读 · 0 评论 -
java并发包JUC
JUC中的集合类 下面,我们先了解JUC包中集合类的框架;为了方便讲诉,我将JUC包中的集合类划分为3部分来进行说明。在简单的了解JUC包中集合类的框架之后,后面的章节再逐步对各个类进行介绍。1. List和SetJUC集合包中的List和Set实现类包括:CopyOnWriteArrayList,CopyOnWriteArraySet和ConcurrentSkipListSet。ConcurrentSkipListSet稍后在说明Map时再说明,CopyOnWriteArrayL...原创 2020-10-01 14:34:30 · 1520 阅读 · 0 评论 -
List类线程不安全的原因及其解决方法及原理
多线程下ArrayList类线程不安全的解决方法及原理ArrayList类在多线程环境下是线程不安全的,在多线程读写情况下会抛出并发读写异常(ConcurrentModificationException): 1 import java.util.ArrayList; 2 import java.util.List; 3 import java.util.UUID; 4 5 public class NoSafeArrayList { 6 public static voi原创 2020-08-06 18:12:34 · 2222 阅读 · 0 评论 -
JUC锁: AQS介绍
常见问题:AQS 原理?;CountDownLatch 和 CyclicBarrier 了解吗,两者的区别是什么?用过 Semaphore 吗?1 AQS 简单介绍AQS 的全称为(AbstractQueuedSynchronizer),这个类在 java.util.concurrent.locks 包下面。AQS 是一个用来构建锁和同步器的框架,使用 AQS 能简单且高效地构造出应用广...原创 2020-04-02 12:50:02 · 333 阅读 · 0 评论 -
JUC锁之LockSupport
LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。它的内部其实两类主要的方法:park(停车阻塞线程)和unpark(启动唤醒线程)。原创 2021-06-18 12:55:59 · 1510 阅读 · 3 评论 -
JUC之Callable接口,Future接口
Java多线程-Callable的Future返回值的使用一般使用线程池执行任务都是调用的execute方法,这个方法定义在Executor接口中:public interface Executor { void execute(Runnable command);}这个方法是没有返回值的,而且只接受Runnable。那么像得到线程的返回值怎嘛办呢?在ExecutorService接口中能找到这个方法:<T> Future<T> submit(.原创 2020-09-03 17:40:34 · 642 阅读 · 1 评论 -
JUC之一篇学会线程池运用
线程池简介1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池。使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动一条线程来执行这个任务,执行结束以后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。2. 线程池的工作机制 2.1 在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有...原创 2020-08-22 23:14:44 · 207 阅读 · 0 评论 -
JUC - 包含内容概述
JUC类包导图:理解以下类Lock框架和Tools类 类结构总览 接口: Condition 接口: Lock 接口: ReadWriteLock 抽象类: AbstractOwnableSynchonizer 抽象类(long): AbstractQueuedLongSynchronizer 核心抽象类(int): AbstractQueuedSynchonizer 锁常用类: LockSupport 锁常用类: ReentrantLock 锁常用类:原创 2021-06-17 08:39:52 · 865 阅读 · 0 评论 -
java中的锁,读写锁原理介绍
###Java中的锁锁是类似于同步块的一种线程同步机制除了锁比Java中同步块更复杂外。锁是使用同步块创建的,因此,我们并不能完全摆脱synchronized关键字。在java.util.concurrent.locks包中有几种锁实现,所以你可能自己实现锁。但是,你仍然需要知道如何使用它们以及它们背后的实现原理。####一个简单的锁让我们先看一个Java代码中的同步块:public class Counter{ private int count = 0; public int in原创 2020-08-21 16:19:18 · 693 阅读 · 0 评论 -
java内存模型介绍
####Java内存模型Java内存模型描述了Java虚拟机和计算机内存之间是如何协同工作的。一个Java虚拟机也是一个完整的计算机的模型,因此,这个模型自然也包含了内存模型。如果你想写出表现良好的并发程序就必须理解Java内存模型。Java内存模型描述了不同线程间如何和何时看到被其他线程修改的共享变量以及在需要时如何同步访问共享变量。原来的Java内存模型存在很多不足,所以在Java5时进行了修改。这个一直使用至今。####Java内存模型每个运行在Java虚拟机中的线程都拥有自己的线程栈。这原创 2020-08-21 10:21:19 · 302 阅读 · 0 评论 -
线程中的锁
####饥饿和公平如果一个线程因为其他线程抢占了所有的CPU时间,它就被称为“饥饿”(starvation)。解决饥饿的方案被称为“公平”(fairness)——所有的线程公平的获得执行的机会。#####引发饥饿在Java中,通常由下面三个主要的原因导致线程饥饿高优先级的线程占用了所有的CPU时间线程无限期的等待进入一个同步代码块,因为其他线程一直被允许进入这个同步代码块线程持续的在一个对象上等待,由于其他线程持续的被唤醒#####在Java中线程间实现公平竞争在Java中,100%实现原创 2020-08-21 09:50:04 · 685 阅读 · 0 评论 -
分析同步器相同点
###剖析同步器虽然许多同步器(如锁,信号量,阻塞队列等)功能上各不相同,但它们的内部设计上却差别不大。换句话说,它们内部的的基础部分是相同(或相似)的。了解这些基础部件能在设计同步器的时候给我们大大的帮助。这就是本文要细说的内容。大部分同步器都是用来保护某个区域(临界区)的代码,这些代码可能会被多线程并发访问。要实现这个目标,同步器一般要支持下列功能:状态访问条件状态变化通知策略Test-and-Set方法Set方法并不是所有同步器都包含上述部分,也有些并不完全遵照上面的内容。但通常原创 2020-08-21 09:09:43 · 203 阅读 · 0 评论 -
多线程给我们带来了什么
开发中所用到的多线程实例越来越多,同时java JDK提供的多线程并发类越来越完善,那么多线程给我们带来了什么呢? 更好的资源利用 磁盘IO、网络IO等 在一些情景下简化程序设计 提高程序响应性 多线程的开销不要为了多线程而使用多线程 更复杂的设计 控制临界资源的访问 出现问题,难以调试、重现和修复 ... 上下文切换次数过高 当CPU发生上下文切换时,需要保存现场原创 2020-08-21 08:49:48 · 187 阅读 · 0 评论 -
阻塞算法与非阻塞算法对比及分析
###非阻塞算法在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法。在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的。为了更好的理解阻塞算法和非阻塞算法之间的区别,先介绍一下阻塞算法然后再介绍非阻塞算法。####阻塞并发算法一个阻塞并发算法一般分下面两步:执行线程请求的操作阻塞线程直到可以安全地执行操作很多算法和并发数据结构都是阻塞的。例如,java.util.concurrent.BlockingQueue的不同原创 2020-08-21 08:44:33 · 987 阅读 · 1 评论 -
JUC之 atomic——核心CAS 原子操作atomic
1、什么是CAS?CAS:Compare and Swap,即比较再交换。是一种实现并发算法时常用到的技术,Java并发包中的很多类都使用了CAS技术。本文将深入的介绍CAS的原理。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK 5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。2、CAS算法理解对CAS的理解,CAS是一种无锁算法,CAS原创 2020-08-06 15:15:41 · 727 阅读 · 0 评论