
并发编程
文章平均质量分 84
Java并发编程相关
Minor王智
好好学习,天天向上!
展开
-
面试常问Future、FutureTask和CompletableFuture
CompletableFuture就是为了多个异步任务编排而诞生的强大JUC包下的工具,CompletableFuture是对Future的扩展和增强。不同的是,join方法抛出的是未受检异常,get抛出的是受检异常需要手动处理。CompletableFuture提供有2种异步任务的执行方式runAsync、supplyAsync他们的区别就是后者支持有返回值的场景。需要注意的是,FutureTask的任务状态是单向的,一旦任务完成以后,他的状态就不可逆。...原创 2022-07-26 21:26:31 · 1041 阅读 · 0 评论 -
Java集合容器相关面试题整理HashMap、ConcurrentHashMap
Java的集合框架是一个容器体系,它是Java数据结构的多种实现。Iterator接口定义了遍历集合的一种方式,它提供了:1.2 ListIterator接口List集合的专属迭代器,继承自Iterator接口。他的特点是可以向前和向后两个方向遍历集合,遍历的同时可以修改集合。Collection和Map一起组成了Java集合框架的两个根接口,定义了集合框架通用的一些方法和规则。Collection定义了单元素的集合定义,Map则是对键值对的抽象。Collections是集合框架提供的工具类,内部提供了原创 2022-07-04 21:54:59 · 607 阅读 · 0 评论 -
Java线程池基本原理
Executors类似于Collections作用域集合领域一样,它是线程池的工具类,可以通过静态方法构造出不同特性的线程池让我们快速使用。常见的Executors创建线程池有几种:1.2 ExecutorService接口ExecutorService接口继承自Executor接口,Executor接口至定义了一个execute(Runnable r)抽象方法,ExecutorService是对Executor的补充,它定义了线程池的一系列同样方法:1.3 自定义线程池ThreadPoolExecu原创 2022-07-04 15:52:05 · 150 阅读 · 0 评论 -
分治思想ForkJoin原理分析
CPU密集型任务的特点就是计算密集,对CPU的依赖相当高,对于这样的任务线程分配的最佳实践就是CPU核心数的2倍,如果设置过多会导致线程上下文切换十分频繁。IO密集型任务属于IO频繁,例如数据库的访问、文件访问、网络传输等,这些操作不会耽误CPU的资源但是会消耗IO资源,任务的执行时长较长。这样的任务线程分配最佳实践就是多余CPU的核心数好几倍。但是对于IO密集型的任务需要压测来进行最优的分配。分而治之的指导思想就是将一个规模为N的问题进行分解拆分为K个小的子问题,这些子问题相互独立并且原理性质相同,甚至子原创 2022-07-02 17:14:35 · 258 阅读 · 0 评论 -
聊聊BlockingQueue阻塞队列
阻塞式队列顾名思义在队列FIFO的结构模式下增加了阻塞的功能,也就是说给队列添加元素和弹出元素的操作会有阻塞的行为。Queue接口继承自Collection,属于Java集合的一员。它提供了一系列的对队列这种FIFO结构的抽象方法。...原创 2022-07-02 17:13:03 · 1117 阅读 · 0 评论 -
ReentrantReadWriteLock读写锁
在多线程访问同一个资源的情况下要保证线程安全性问题还要保证性能可以采用JDK提供的读写锁,读写锁更加适合在读远多于写的场景。读写锁的特点是:读读并发、读写互斥、写读互斥、写写互斥。在读大于写的并发场景,读写锁比ReentrantLock性能高很多。读写锁内部维护了2个锁,一个负责读锁,一个负责写锁。读锁在同一时刻可以由多个读线程持有。读锁是共享的,写锁是独占的。在AQS中通过state值来标识锁的状态,读写锁因为有两把锁,所以需要将state一个变量来表示两个锁的状态。通过int的高低位来表示,高16位表原创 2022-07-02 17:10:26 · 352 阅读 · 0 评论 -
AQS之信号量、闭锁、栅栏的使用和原理
信号量是操作系统中PV操作的原语在Java语言层面的一种实现,底层基于AQS实现。信号量用一个基数来表示资源的可用数量,每个线程可以获取一个或多个资源,资源为0原创 2022-07-02 17:08:36 · 861 阅读 · 0 评论 -
聊聊AQS和ReentrantLock原理
是JUC包下面的一个抽象类,抽象队列同步器,AQS是一个抽象同步框架,它的底层已经实现了并发同步相关的操作,例如阻塞、唤醒等机制。我们一般可以基础AQS或者用内部类的方式来使用它。AQS的特性具有:...原创 2022-07-02 17:06:42 · 483 阅读 · 0 评论 -
面试必问synchronized内存语义和锁升级锁优化、偏向锁、轻量级锁、重量级锁
一段程序代码内如果存在对共享资源的多线程访问,称这段代码块为,共享资源为。多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测,称之为发生了竞态条件。解决竞态条件的发生,可以有多挣手段可以解决:1.3 公平/非公平锁线程是否根据抢锁顺序执行这并不是公平、非公平的判断依据。公平锁和非公平锁的区别在于在。只要入队以后,就不存在公不公平的问题了。内置锁和AQS都是这个意思,只不过内置锁和AQS对抢锁顺序的策略有所不同罢了。synchronized又称,底层是基于Monitor监视器机制实现,其内存原创 2022-07-02 17:03:40 · 943 阅读 · 0 评论 -
深入理解CAS和常用原子类
针对一个变量,首先对变量进行修改,然后比较它的内存值和期望值进行比较,如果相同则将修改后的新值覆盖内存,否则什么都不处理。CAS的比较和交换两个步骤通过CPU的一个汇编指令执行,具有原子性,通常CAS可以看做是一种乐观锁的机制。Java的CAS机制是通过unsafe类来进行API调用完成,例如对int变量的CAS操作,可...原创 2022-07-02 16:59:22 · 1062 阅读 · 0 评论 -
深入理解Java线程
:操作系统分配资源的最小单元,是一个程序在操作系统的一个实例抽象。:是CPU调度执行最小单元,一个进程可包含多个线程,是一个指令序列。:程序运行在用户空间,也只能访问到用户空间的数据。:程序运行在内核空间,拥有所有资源的访问权限。进程(线程)的上下文切换只能发生在内核模式下。上下文切换主要有三个步骤:...原创 2022-07-02 16:56:37 · 438 阅读 · 0 评论 -
Java内存模型JMM和并发三大特性(volatile、MESI、总线风暴、内存屏障)
现代计算机模型中,CPU的最小调度单元就是线程,在OS中,县城管就是进程中的一条执行流程,同一个进程中多个线程可以共享代码片段、数据段、打开的文件等,但是每个线程都有专属自己的寄存器、栈结构。:在同一时刻,有多条指令在多个CPU核心上同时执行。:在同一时刻,同一个CPU核心上只能执行一条指令,多个线程被快速的调度切换来占用CPU核心的计算资源,在微观尺度上并不是同时执行,但在人类感触宏观表现是同时执行。并发的概念可以在单核架构存在,多核和多CPU同样也存在线程并发的概念。......原创 2022-07-02 16:53:34 · 1426 阅读 · 1 评论