
JUC
文章平均质量分 80
JUC
ximeneschen
这个作者很懒,什么都没留下…
展开
-
Callable和Future接口的实现
一、Callable和FutureCallable接口定义了一个call方法可以作为线程的执行体,但call方法比run方法更强大:call方法可以有返回值call方法可以申明抛出异常Callable接口是JDK5后新增的接口,而且不是Runnable的子接口,所以Callable对象不能直接作为Thread的target。call方法还有一个返回值,call方法不能直接调用,它作为线程的执行体被调用。那么如何接收call方法的返回值?JDK1.5提供了Future接口来代表Cal原创 2021-09-12 14:08:30 · 295 阅读 · 0 评论 -
分支合并 Fork-Join 框架
一、什么是 Fork-JoinFork/Join框架是Java7提供了的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架,这种开发方法也叫分治编程。分治编程可以极大地利用CPU资源,提高任务执行的效率,也是目前与多线程有关的前沿技术。框架图:fork():利用另一个 ForkJoinPool 线程异步执行新创建的子任务join():读取第一个子任务的结果,尚未完成就等待二、传统的分治编程会遇到什么问题分治的原理上面已经介绍了,就原创 2021-09-11 19:49:02 · 213 阅读 · 0 评论 -
JUnit单元测试中多线程的坑
一、JUnit单元测试方法不输出在JUnit的@Test方法中启用多线程,新启动的线程会随着@Test主线程的死亡而不输出二、解决方法在@Test方法中每创建一个线程,就join一下,这样我们新建的线程不死亡,Test主线程也不会死亡让主线程睡眠一会,等待其它线程结束后本线程在结束使用CountLatch等同步器同步一下,让主线程等其它线程结束后在结束其它方法,总之就是让@Test的线程等待我们新建的线程运行结束后再结束方法1 Thread.join()@Test p转载 2021-09-10 01:03:11 · 990 阅读 · 0 评论 -
多线程总结
一、并行,并发、串行、进程、线程进程与线程进程和线程的关系就是:一个进程可以包含一个或多个线程,但至少会有一个线程操作系统调度的最小任务单位其实不是进程,而是线程。常用的Windows、Linux等操作系统都采用抢占式多任务,如何调度线程完全由操作系统决定,程序自己不能决定什么时候执行,以及执行多长时间。因为同一个应用程序,既可以有多个进程,也可以有多个线程,因此,实现多任务的方法,有以下几种:多进程模式(每个进程只有一个线程):多线程模式(一个进程有多个线程):多进程+多原创 2021-04-01 18:05:18 · 264 阅读 · 0 评论 -
ThreadLocal 和 InheritableThreadLocal
在学习ThreadLocal之前,建议先了解Java中的4种引用一、先看一下Thread,ThreadMap,ThreadLocal的关系Thread中持有一个ThreadLocalMap ,这里你可以简单理解为就是持有一个数组,这个数组是Entry 类型的。 Entry 的key 是ThreadLocal 类型的(准确说是一个指向ThreadLocal的引用),value 是Object 类型。也就是一个ThreadLocalMap 可以持有多个ThreadLocal。他们是一对多的关系这里明明确原创 2021-04-02 15:32:18 · 419 阅读 · 0 评论 -
理清ThreadLocal、ThreadLocalMap、Thread之间的关系
引言这三种的关系由于大量的内部类的关系,第一次看的时候还是有点绕的,感觉你是老子的孙子,又是老子的老子。我还是建议你先抛开内部类的关系,把每一个类当作普通类来看到,理解每個类的职责,最后再把内部类放进去考虑这样设计的目的。这里也给大家一个启示,面对复杂的事情的时候,我们需要跳出来,先把问题简单化,大方向把握了,再进一步去细化每一个功能点和设计的艺术。关系图解接下来我们看下面一张图从上图我们可以发现Thread 中持有一个ThreadLocalMap ,这里你可以简单理解为就是持有一个数组,这个数组转载 2021-01-10 22:50:29 · 262 阅读 · 0 评论 -
为什么wait、notify必须在synchronized保护的同步代码中
先思考如果wait、notify不在synchronized保护的同步代码中的样子://经典的生产者与消费者public class BlockingQueue{ Queue<String> buffer=new LinkedList<String>(); //负责往buffer中添加数据,添加完后执行notify唤醒之前等待的线程。 public void give(String data){ buffer.add(data);转载 2021-01-10 22:30:03 · 197 阅读 · 0 评论 -
为什么wait、notify、notifyAll方法定义在Object中而不是Thread类中
多线程概述Java是一个支持多线程的开发语言,多线程并发执行任务可以充分利用CPU资源,提高多任务并发执行效率(注意区分:多线程并不会加快任务的执行速度,而是可以充分利用多核CPU让线程轮流进行工作,达到了一种“同时”工作的效果)。并发时的产生问题多线程在执行时,会遇到一些问题,问题的关键原因则是在共享资源的更新操作上容易产生冲突。解决的方向解决冲突的方式则是从共享资源的占用机制入手,保证共享资源同一时刻只能被一个线程占用,从而达到数据一致。具体实现方式中的一种在Java中提供了synchor转载 2021-01-10 22:23:30 · 1825 阅读 · 0 评论 -
Java创建多线程的8种代码方式
1、继承Thread类,重写run()方法//方式1package cn.itcats.thread.Test1; public class Demo1 extends Thread{ //重写的是父类Thread的run() public void run() { System.out.println(getName()+"is running..."); } public static void main(String[] args) { Demo1 demo1转载 2020-11-27 10:30:52 · 366 阅读 · 0 评论 -
快速失败(fail-fast)和安全失败(fail-safe)
我们都接触 HashMap、ArrayList 这些集合类,这些在 java.util 包的集合类就都是快速失败的;而 java.util.concurrent 包下的类都是安全失败,比如:ConcurrentHashMap。1. 快速失败(fail-fast)在使用迭代器对集合对象进行遍历的时候,如果 A 线程正在对集合进行遍历,此时 B 线程对集合进行修改(增加、删除、修改),或者 A 线程在遍历过程中对集合进行修改,都会导致 A 线程抛出 ConcurrentModificationExcept转载 2020-07-29 16:23:59 · 239 阅读 · 0 评论 -
ScheduledThreadPoolExecutor详解
一、ScheduledThreadPoolExecutor简介:主要用于执行周期性任务;所以在看本文之前最好先了解一下 ThreadPoolExecutor ,可以参考 ThreadPoolExecutor 详解;另外 ScheduledThreadPoolExecutor 中使用了延迟队列二、ScheduledThreadPoolExecutor 结构概述继承关系public class ScheduledThreadPoolExecutor extends ThreadPoolExecut原创 2020-07-29 11:43:50 · 16584 阅读 · 0 评论 -
Java线程池Executor框架
一、为什么要引入线程池当存在大量并发任务时,创建、销毁线程需要很大的开销,运用线程池可以大大减小开销。二、Executor框架说明:Executor 执行器接口,该接口定义执行Runnable任务的方式。 ExecutorService该接口定义提供对Executor的服务。 ScheduledExecutorService 定时调度接口。AbstractExecutorService 执行框架抽象类。 ThreadPoolExecutor JDK中线程池的具体实现。Executors 线程转载 2020-06-06 16:07:29 · 189 阅读 · 0 评论 -
Condition接口详解
一、condition和对象监视器Condition是对象监视器的替代品,拓展了监视器的语义。相同:都有一组类似的方法:对象监视器: Object.wait()、Object.wait(long timeout)、Object.notify()、Object.notifyAll()。Condition对象: Condition.await()、Condition.awaitNanos(long nanosTimeout)、Condition.signal()、Condition.signalA转载 2020-06-05 17:55:50 · 898 阅读 · 0 评论 -
Java原子类
我们知道Java提供了两种方式来处理线程安全的问题。第一种是互斥同步(悲观锁),第二种是采用非阻塞式同步(乐观锁)。虽然以上两种方案都能解决线程安全的问题。但是在JDK1.5开始,就提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了更为简单高效、线程安全的方式来更新一个变量的值。例如AtomicBoolean、AtomicLong、AtomicInteger等。(这里提到的Atomic系列类原理都是CAS操作)一、原子类作用及类型作用:由Atomic可知,这些类提转载 2020-06-02 20:02:52 · 682 阅读 · 0 评论 -
原子操作的实现原理(锁和循环CAS)
本文转自https://www.cnblogs.com/duanxz/archive/2012/08/09/2630071.html一、引言原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。二、术语定义三、处理器如何实现原子操作32位IA-32处理器使用基于对缓存加锁或总线加锁的方式来实现多处理转载 2020-06-02 18:59:29 · 845 阅读 · 0 评论 -
深入理解AbstractQueuedSynchronizer(AQS)
本文转自:https://juejin.im/post/5aeb07ab6fb9a07ac36350c8一、AQS简介在同步组件的实现中,AQS是核心部分,同步组件的实现者通过使用AQS提供的模板方法实现同步组件语义,AQS则实现了对同步状态的管理,以及对阻塞线程进行排队,等待通知等等一些底层的实现处理。AQS的核心也包括了这些方面:同步队列,独占式锁的获取和释放,共享锁的获取和释放以及可中断锁,超时等待锁获取这些特性的实现,而这些实际上则是AQS提供出来的模板方法,归纳整理如下:独占式锁://原创 2020-05-31 15:39:49 · 1386 阅读 · 0 评论 -
初识Lock与AbstractQueuedSynchronizer(AQS)
本文转载于:https://juejin.im/post/5aeb055b6fb9a07abf725c8c一、concurrent包的结构层次在针对并发编程中,Doug Lea大师为我们提供了大量实用,高性能的工具类,针对这些代码进行研究会让我们队并发编程的掌握更加透彻也会大大提升我们队并发编程技术的热爱。这些代码在java.util.concurrent包下。如下图,即为concurrent包的目录结构图。其中包含了两个子包:atomic以及lock,另外在concurrent下的阻塞队列以及ex转载 2020-05-30 18:03:15 · 184 阅读 · 0 评论 -
阻塞队列(BlockingQueue)
一、 什么是阻塞队列BlockingQueue 接口表示一个线程安放入和提取实例的队列,其数据结构(生产者、消费者模式)如下:阻塞算法:阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁)等方式来实现。非阻塞算法:非阻塞的实现方式则可以使用循环CAS的方式来实现。JUC中的非阻塞队列有ConcurrentLinkedQueue和ConcurrentLinke...原创 2020-04-17 14:36:58 · 254 阅读 · 0 评论 -
concurrenthashmap 1.7/1.8
一、ConcurrentHashMap1.71.7的ConcurrentHashMap采用分段锁的机制,实现并发的更新操作,底层采用数组+链表的存储结构。其包含两个核心静态内部类 Segment和HashEntry。Segment该类继承了ReentrantLock重入锁来当作锁的角色,每个Segment对象维护了每个散列映射表中的若干个桶(每个桶是由若干个 HashEntry 对象链...原创 2020-04-20 00:12:06 · 812 阅读 · 0 评论 -
JUC重要辅助类(同步组件及锁)
一、CountDownLatch(计数器)原理:CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,这些线程会阻塞。其它线程调用countDown方法会将计数器减1(调用countDown方法的线程不会阻塞),当计数器的值变为0时,await方法阻塞的线程会被唤醒,继续执行。代码:/** * @Description: * 让一些线程阻塞直到另一些线...原创 2020-04-17 10:47:24 · 176 阅读 · 0 评论 -
Lock接口&Condition,以及Lock与synchronized异同
一、synchronized与Lock基于synchronized关键字去实现同步的,(jvm内置锁,也叫隐式锁,由我们的jvm自动去加锁跟解锁的)juc下的基于Lock接口的这样的一种锁的实现方式(显式锁,他需要我们手动的去加锁,跟解锁)二、Lock接口的实现锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件...原创 2020-04-17 01:03:25 · 332 阅读 · 0 评论 -
Java四种线程创建的思路
一、哪四种传统的是继承thread类和实现runnable接口,java5以后又有实现callable接口和java的线程池获得。1.继承Thread类创建线程Thread类本质上是实现了Runnable接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过Thread类的start()实例方法。start()方法是一个native方法,它将启动一个新线程,并执行run()方法。我...原创 2020-04-16 00:43:52 · 337 阅读 · 0 评论 -
线程八锁问题
理解线程八锁问题的关键:synchronized实现同步的基础,Java中的每一个对象都可以作为锁。具体表现为以下3种形式。1.对于普通同步方法,锁是当前实例对象(this)。2.对于静态同步方法,锁是当前类的Class对象。3.对于同步方法块,锁是Synchonized括号里配置的对象一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个syn...转载 2020-04-14 16:55:16 · 279 阅读 · 0 评论 -
ArrayList为何线程不安全,如何解决
我们知道ArrayList是线程不安全的,与之对应的线程安全Vector,为何?看源码ArrayList: public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! //ensureCapacityInternal()这个方法的作用就是判断如果...原创 2020-04-14 14:58:10 · 1749 阅读 · 1 评论 -
线程的虚假唤醒
//真正唤醒while (!cond) { lock.wait();}//虚假唤醒if(!code){lock.wait();}在不同的语言,甚至不同的操作系统上,条件锁都会产生虚假唤醒现象。所有语言的条件锁库都推荐用户把wait()放进循环里:我们知道wait()状态的时候,线程会释放资源,等到被唤醒的时候,从上次wait()的地方醒来,继续执行,如果使用条件判断,判...原创 2020-04-14 12:44:55 · 226 阅读 · 0 评论 -
volatile关键字及JMM模型
开门见山说:被volatile修饰的共享变量,就具有了以下两点特性: 1 .保证了不同线程对该变量操作的内存可见性; 可见性: 在多线程情况下,读和写发生在不同的线程中,而读线程未能及时的读到写线程写入的最新的值 2 .禁止指令重排序 重排序:其实就是指执行的指令顺序重新排序(不是按代码顺序)JMM存储结构与CPU对应模型:加入高速缓存后的CPU执行流程:...原创 2020-04-14 00:46:23 · 230 阅读 · 1 评论 -
线程间通信及虚假唤醒
//真正唤醒while (!cond) { lock.wait();}//虚假唤醒if(!code){lock.wait();在不同的语言,甚至不同的操作系统上,条件锁都会产生虚假唤醒现象。所有语言的条件锁库都推荐用户把wait()放进循环里:我们知道wait()状态的时候,线程会释放资源,等到被唤醒的时候,从上次wait()的地方醒来,继续执行,如果使用条件判断,判断完code==true,然后wait(),其他线程将code修改成flase,然后再唤醒本线程,此时,本线程不会.原创 2020-04-13 15:35:51 · 165 阅读 · 0 评论 -
互斥锁、自旋锁和自适应自旋锁
互斥锁:从 实现原理上来讲,Mutex属于sleep-waiting类型的锁。例如在一个双核的机器上有两个线程(线程A和线程B),它们分别运行在Core0和 Core1上。假设线程A想要通过pthread_mutex_lock操作去得到一个临界区的锁,而此时这个锁正被线程B所持有,那么线程A就会被阻塞 (blocking),Core0 会在此时进行上下文切换(Context Switch)将线程...转载 2020-04-13 01:50:12 · 273 阅读 · 0 评论 -
Synchronized关键字和锁升级
一、Synchronized对于多线程不安全(当数据共享(临界资源),而多线程同时访问并改变该数据时,就会不安全),JAVA提供的锁有两个,一个是synchronized关键字,另外一个就是lock类。JDK1.6之前,synchronized是一个重量级锁,使用不方便,性能低下。JDK1.6之后,synchronized进行了很大的优化,加入了偏置锁、轻量级锁、自旋锁等,大大提高了synchr...原创 2020-04-12 00:54:08 · 435 阅读 · 0 评论 -
JUC
一、什么是JUC在Java 5.0 提供了java.util.concurrent(简称JUC )包,在此包中增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步IO 和轻量级任务框架。提供可调的、灵活的线程池。还提供了设计用于多线程上下文中Collection 实现等。二、进程和线程1.进程与线程(QQ音乐(这是一个进程)与评论+播放歌曲(这是两个线程...转载 2020-04-11 06:43:57 · 119 阅读 · 0 评论