JUC 并发编程
文章平均质量分 92
一丨口月
这个作者很懒,什么都没留下…
展开
-
Fork/Join
文章目录Fork/Join (工作窃取)① Fork/Join 框架简介②ForkJoinPool③ Fork/Join 框架的实现原理④ Fork/Join 框架的异常处理Fork/Join (工作窃取)① Fork/Join 框架简介Fork/Join 它可以将一个大的任务拆分成多个子任务进行并行处理,最后将子任务结果合并成最后的计算结果,并进行输出。Fork/Join 框架要完成两件事情:Fork:把一个复杂任务进行分拆,大事化小Join:把分拆任务的结果进行合并任务分割:首先 Fo原创 2022-05-03 14:09:15 · 443 阅读 · 0 评论 -
Volatile实现原理
文章目录Volatile底层实现DCL锁DCL需不需要加Volatile???Volatile三大特性:①保证可见性缓存一致性MESI总线嗅探总线风暴②不保证原子性解决不保证原子性添加synchronized/lock锁使用原子类解决③禁止指令重排序指令重排序:as-if-serial语义:happens-before原则:volatile禁止指令重排内存屏障Volatile底层实现保证内存可见性Volatile缓存可见性实现原理:底层实现主要通过汇编lock前缀指令,他会锁定这块区域的缓存(缓存行原创 2022-05-02 14:36:50 · 660 阅读 · 0 评论 -
ABA-->狸猫换太子之法
文章目录ABA问题发生ABA问题示例代码带版本号的原子操作解决ABA问题实例代码:ABA问题CAS需要检查操作值有没有发生改变,如果没有发生改变则更新。但是存在这样一种情况:如果一个值原来是A,变成了B,然后又变成了A,那么在CAS检查的时候会发现没有改变,但是实质上它已经发生了改变,这就是所谓的ABA问题。对于ABA问题其解决方案是加上版本号,即在每个变量都加上一个版本号,每次改变时加1,即A —> B —> A,变成A1 —> B2 —> A3。JUC包中提供了一个Ato原创 2022-05-01 11:09:27 · 185 阅读 · 0 评论 -
LongAdder
文章目录LongAdderAtomicLong VS LongAdderLongAdder核心思想:将热点数据分离。CAS 底层实现是在一个死循环中不断地尝试修改目标值,直到修改成功。如果竞争不激烈的时候,修改成功率很高,否则失败率很高。在失败的时候,这些重复的原子性操作会耗费性能。(不停的自旋,进入一个无限重复的循环中)LongAdderLongAdder,尝试使用分段CAS以及自动分段迁移的方式来大幅度提升多线程高并发执行CAS操作的性能!(JDK1.8新特性)在LongAdder的底层实原创 2022-05-01 11:04:36 · 238 阅读 · 0 评论 -
JUC-CAS机制
文章目录CAS代码实例CAS:CAS缺陷CASCAS的英文为Compare and Swap 翻译为比较并交换,是CPU硬件级别提供的功能。java.util.concurrent包中使用该技术实现乐观锁,换句话说java.util.concurrent包是完全建立在CAS之上,AQS同步组件、Atomic原子类操作等都是基于CAS实现的。CAS在JUC包中所处的位置如图:CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做原创 2022-04-30 14:11:47 · 1327 阅读 · 3 评论 -
Java内存模型
文章目录JMM--Java内存模型JMM的同步约定:JMM原子操作:CPU高速缓存(Cache Memory)CPU为何要有高速缓存多核CPU多级缓存一致性协议MESI如何实现线程可见①总线加锁(性能太低):②MESI缓存一致性协议:JMM–Java内存模型Java线程内存模型跟CPU缓存模型类似,是基于CPU缓存模型来建立的,Java线程内存模型是标准化,屏蔽了底层不同计算机的区别。JMM的同步约定:线程解锁前,必须把共享变量 立即放回主存线程加锁前,必须读取主存中的最新值到工作内存中加锁和原创 2022-04-28 08:10:42 · 67 阅读 · 0 评论 -
JUC热榜前三的辅助类
文章目录JUC强大的辅助类① 减小计数 CountDownLatch (-1操作)② 循环栅栏 CyclicBarrier (+1操作)3 信号灯 SemaphoreJUC强大的辅助类JUC 中提供了三种常用的辅助类,通过这些辅助类可以很好的解决线程数量过 多时 Lock 锁的频繁操作。这三种辅助类为:• CountDownLatch: 减少计数• CyclicBarrier: 循环栅栏• Semaphore: 信号灯① 减小计数 CountDownLatch (-1操作)CountDown原创 2022-04-27 17:12:38 · 179 阅读 · 0 评论 -
JUC阻塞队列
文章目录阻塞队列BlockingQueue 简介BlockingQueue 的优势BlockingQueue 核心方法抛出异常方法特殊值方法阻塞方法超时方法检测方法BlockingQueue的种类① ArrayBlockingQueue(常用)② LinkedBlockingQueue(常用)③ DelayQueue④ PriorityBlockingQueue⑤ SynchronousQueue⑥ LinkedTransferQueue⑦ LinkedBlockingDeque阻塞队列在多线程领域:在原创 2022-04-26 12:31:42 · 246 阅读 · 0 评论 -
ThreadPool 线程池
文章目录ThreadPool 线程池线程池简介(三大方法,七大参数,四大策略)Executor类线程池参数说明拒绝策略(重点)Executors线程池的方法与创建newCachedThreadPool(常用)(可扩容)newFixedThreadPool(常用)(固定)newSingleThreadExecutor(常用)(单个)线程池的提交方式execute()submit()线程池的关闭方式ThreadPool 线程池三大方法:newSingleThreadExecutor(常用)(单个)–&原创 2022-04-25 10:22:25 · 4587 阅读 · 0 评论 -
Java线程的创建方式
7.Callable&Future 接口 目前我们学习了有两种创建线程的方法-一种是通过创建 Thread 类,另一种是通过使用 Runnable 创建线程。但是,Runnable 缺少的一项功能是,当线程终止时(即 run()完成时),我们无法使线程返回结果。为了支持此功能, Java 中提供了 Callable 接口。现在我们学习的是创建线程的第三种方案—Callable 接口Callable 接口的特点如下(重点)• 为了实现 Runnable,需要实现不返回任何内容的 run()方原创 2022-04-24 18:51:03 · 2196 阅读 · 0 评论 -
死锁的产生及解决
文章目录死锁代码演示:验证是否是死锁:死锁产生的必要条件:什么时候会发生死锁:预防死锁①破坏互斥条件②破坏不剥夺条件③破坏请求和保持条件④破坏循环等待条件就好比,小情侣们每天都要让对方说爱自己,究竟谁更爱谁就产生了死锁,哈哈哈哈哈。解决死锁的办法就是互相给对方戴green帽死锁两个或两个以上的进程因为争夺资源造成的一种等待的过程就是死锁,如果没有外力干涉,就不可能再进行下去。代码演示:package com;public class DeadLock { //创建两个对象原创 2022-04-23 19:15:09 · 429 阅读 · 0 评论 -
Java并发情况下集合的线程安全性
文章目录ConcurrentModificationException并发修改异常5.1List集合的线程不安全①,使用Vector解决②,使用Collections类的synchronizedList方法③ 使用CopyOnWriteArrayList<>(重点)5.2 HashSet集合的线程不安全5.3HashMap集合的多线程不安全ConcurrentModificationException并发修改异常当我们对集合进行迭代(遍历)的时候,同时(并发)对集合进行修改,就会产生并发修改原创 2022-04-23 14:25:11 · 634 阅读 · 0 评论 -
线程间通信
文章目录3,线程间通信3.1使用synchronized锁创建线程进行加一减一操作3.2 使用Lock锁创建线程进行加一减一4,线程间定制化通信4.1 案例介绍3,线程间通信线程间通信的模型有两种:共享内存和消息传递,以下方式都是基本这两种模型来实现的。我们来基本一道面试常见的题目来分析多线程编程模板:1.判断 2.干活 3.通知线程通信的两种写法synchronized()中使用wait()和notifyAll()lock()中使用Condition()的await()和signalAl原创 2022-04-22 17:38:23 · 416 阅读 · 0 评论 -
Lock锁操作机制
什么是Lock锁Lock 锁实现提供了比使用同步方法和语句可以获得的更广泛的锁操作。它们允 许更灵活的结构,可能具有非常不同的属性,并且可能支持多个关联的条件对 象。Lock 提供了比 synchronized 更多的功能。Lock 与的 Synchronized 区别Lock 不是 Java 语言内置的,synchronized 是 Java 语言的关键字,因此是内置特性。Lock 是一个类,通过这个类可以实现同步访问;Lock 和 synchronized 有一点非常大的不同,采用 synch原创 2022-04-21 16:29:00 · 2001 阅读 · 0 评论 -
Synchronized锁机制
文章目录2.1 Synchronized2.1.1 Synchronized 关键字回顾synchronized关键字的底层实现synchronized修饰代码块synchronized修饰普通方法synchronized修饰静态方法2.1.2 售票案例2.1 Synchronized2.1.1 Synchronized 关键字回顾synchronized 关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在原创 2022-04-21 08:43:54 · 442 阅读 · 0 评论 -
JUC 入门简介(一)
1.1JUC简介在Java中,线程部分是一个重点,本篇文章说的是JUC也是关于线程的。JUC就是java.util.concurrent工具类的简称。只是一个处理线程的工具类,JDK1.5开始出现的。1.2线程和进程的概念进程:是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分匹配和调度的基本单位,是操作系统结构的基础。在当代面向线程设计的计算机结构,进程是线程的容器。程序是指令,数据及其组织形式的描述,进程是程序的实体。是计算机中的关于某数据集合上的一次运行活动,是系统进行资源分配和原创 2022-04-20 17:36:55 · 629 阅读 · 0 评论