
并发编程
文章平均质量分 94
Java并发编程专栏,涉及到计算机原理、MESI 协议、JMM内存模型、synchronized关键字、阻塞队列、AQS、CAS源码分析、JUC 工具类、ReentrantLock源码分析、Atomic原子类、Future、Executors线程池相关、JUC集合类、Fork-Join等内容
优惠券已抵扣
余额抵扣
还需支付
¥19.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
扛麻袋的少年
32了,即将被优化,找工作机会……
展开
-
计算机原理结构
1.现代计算机理论模型与工作原理2.计算机五大核心组成部分3.现代计算机基本硬件结构4.CPU内部结构划分1.控制单元2.运算单元3.存储单元5.计算机硬件多CPU架构1.多CPU2.CPU多核3.CPU寄存器4.CPU缓存5.内存1.CPU读取存储器数据过程2.多线程环境下存在的问题1.缓存一致性问题2.指令重排序问题6.CPU计算完成后,何时将数据同步回内存中7.案例分析1.现代计算机理论模型与工作原理 现代计算机模型是基于冯.诺依曼计算机模型。 计算机在运行时,先从内存中取出第原创 2021-11-14 13:58:12 · 8622 阅读 · 3 评论 -
MESI 缓存一致性协议
本文目录场景再现1.总线锁2.MESI 缓存一致性协议1.MESI 协议概念2.通过例子来介绍 MESI 协议1.MESI 场景2.MESI 协议下,执行步骤3.MESI协议失效问题场景再现场景: 服务器有2个线程t1、t2在跑。都对 x=1 分别+1,期望最终结果:x = 3 问题分析: 首先会将 x=1 加载到主内存中,然后 t1线程,会获取到 x=1 的内存地址,然后在寄存器、CPU缓存(L1、L2、L3)中是否存在(L1最优先,L2中如果有,则copy一份到L1,最后加载到寄存器进原创 2021-11-15 17:55:05 · 1577 阅读 · 2 评论 -
提起线程,你不了解的那些事
本文目录1.什么是线程1.用户级线程2.内核级线程3.系统空间2.Java 线程与内核线程的关系3.Java为什么用到多线程1.什么是线程上下文切换2.死锁检测方法 对 MESI 缓存一致性协议,有了初步的了解后,本文来介绍偏内容性的一个话题:线程。 Java 开发者对多线程一定不会陌生,那么线程到底是啥?Java 又是如何利用多线程来调度/使用 CPU 来完成操作的呢。1.什么是线程 线程(英语:thread)是操作系统调度CPU的最小单位。它被包含在进程之中,是进程中的实际运作单位,进程是系统原创 2021-11-16 16:51:14 · 2496 阅读 · 13 评论 -
JMM内存模型 & 多线程三大特性
提起并发编程,就绕不开并发的三大特性(1.原子性、2.可见性、3.有序性);要解决并发编程中遇到的这三类问题,可能很多人也知道大名鼎鼎的 JMM 内存模型,但又有多少人知道 JMM 内存模型是如何解决这三大问题的呢?本文就从原理层面来细细讲解。 在《并发编程》板块,已经有介绍到 1.计算机原理结构 2.MESI缓存一致性协议。这两篇内容介绍的也只是在硬件CPU层面上的解决方案。在 Java 软件层面,就是我们接下来要介绍的 JMM 内存模型,JMM 内存模型就是基于 CPU 底层架构的一种抽象原创 2021-11-19 17:16:26 · 1187 阅读 · 1 评论 -
synchronized 原理、使用、锁升级过程,写到我要吐血了
本文目录1.锁的分类2.synchronized 含义3.synchronized 三种加锁方式1.修饰实例方法2.修饰静态方法3 修饰代码块1.变量锁2.实例对象锁3.当前类的 Class 对象锁4.synchronized 底层原理1.Monitor 管程对象5.synchronized 锁优化升级过程 多线程编程中,会出现多个线程同时访问同一个共享、可变资源的情况,这个资源我们称之其为临界资源;这种资源可以是:对象、变量、文件等。共享:资源可以由多个线程同时访问可变:资源在其生命周期内可以被原创 2021-11-23 16:10:06 · 4682 阅读 · 15 评论 -
JUC 全家桶系列,一键三连就完事了
JUC、AQS、CAS、Lock、ReentrantLock、Atomic、Future、Executors、JUC工具类、JUC集合类、Fork-Join框架原创 2021-12-07 14:15:57 · 2905 阅读 · 1 评论 -
Java实现多线程的三种方式
Java实现多线程,共有如下三种方式: 1.继承Thread类,重写run()方法 2.实现Runnable接口,重写run()方法 3.实现Callable接口,重写call()方法 ①通过 FutureTask 包装器来创建Thread线程,实现待返回值的多线程②通过 ExecutorService、Callable、Future 实现带返回值的多线程原创 2019-12-18 11:13:33 · 1366 阅读 · 0 评论 -
Java多线程的六种状态
多线程笔记(二):Java多线程的六种状态(Thread 类)public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable thread. A thread in ...原创 2019-12-17 13:50:09 · 1807 阅读 · 0 评论 -
可重入读写锁:ReentrantReadWriteLock
可重入读写锁:ReentrantReadWriteLock原创 2020-04-14 14:55:37 · 1387 阅读 · 2 评论 -
Java并发工具类:CountDownLatch、Semaphore、CyclicBarrier、Exchanger、Phaser
写在前面 在 Java 多线程环境下,JDK 提供了许多的工具类来供开发者使用,这些工具类都在java.util.concurrent 并发包下(俗称JUC),使得我们不需要过多的关心具体业务场景下,应该如何写出同时兼顾线程安全性与高效率的代码。之前文章介绍的:Java 线程池内容,全在这里了,也是 JUC 包下的...原创 2020-05-06 16:53:41 · 1604 阅读 · 3 评论 -
Atomic 原子类
本文目录1.基本类型1.AtomicInteger2.AtomicLong3.AtomicBoolean2.引用类型1.AtomicReference2.AtomicMarkableReference3.AtomicStampedReference3.数组类型1.AtomicIntegerArray2.AtomicLongArray3.AtomicReferenceArray4.原子更新字段类1.AtomicIntegerFieldUpdater2.AtomicLongFieldUpdater3.Atomi原创 2021-12-01 09:23:11 · 689 阅读 · 0 评论 -
JUC 阻塞队列
本文目录1.阻塞队列介绍2.BlockingQueue 核心方法1.放入数据2.获取数据3.JUC 中的 BlockingQueue1.ArrayBlockingQueue(常用)2.LinkedBlockingQueue(常用)3.DelayQueue4.PriorityBlockingQueue5.SynchronousQueue6.LinkedTransferQueue7.LinkedBlockingDeque4.ArrayBlockingQueue例子1.阻塞队列介绍 阻塞队列,顾名思义,首先原创 2021-12-01 15:47:17 · 799 阅读 · 0 评论 -
多线程异步调用实现方式:CompletableFuture
本文目录CompletableFuture 简介Future 与 CompletableFutureCompletableFuture 入门1.使用 CompletableFuture2.没有返回值的异步任务3.有返回值的异步任务4. 线程依赖5.消费处理结果6.异常处理7.结果合并8.合并多个任务的结果:allOf 与 anyOf9.其它一些方法 创建线程时,除了 实现Callable接口,重写call()方法,通过FutureTask包装器来创建Thread线程,通过 get() 方法获得返回值外。原创 2021-11-01 15:56:16 · 1367 阅读 · 2 评论 -
【Java面试题】Java 线程池创建,全部考点都在这里了
1.为什么要是用线程池 在介绍 Java 线程池之前,我们先来一个示例。通过示例来直观了解一下:第一段代码执行,用时 6231ms,第二段代码执行,用时273ms。第二段代码默认的线程池中的线程数是50,如果把这个数量减小,虽然系统的处理数据能力变弱了,但是速度却更快了。从执行效率方面,就足够说明问题了。/**...原创 2020-04-29 19:27:03 · 1077 阅读 · 0 评论 -
为什么阿里巴巴要禁用Executors创建线程池?
看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,通过源码分析禁用的原因写在前面通过阅读本篇文章你将了解到:线程池的定义Executors创建线程池的几种方式ThreadPoolExecutor对象线程池执行任务逻辑和线程池参数的关系Executors创建返回ThreadPoolExecutor对象OOM异常测试如何定义线程池参数如果只想知道原因可以直接拉到总结那线程池的定义管理一组工作线程。通.转载 2020-08-14 11:39:03 · 1022 阅读 · 0 评论 -
【Java面试题】ThreadLocal,你想了解的都在这里(进来瞧瞧不后悔)
1.什么是 ThreadLocal2.ThreadLocal源码2.1 实现思路2.2 分析前你该知道1.ThreadLocalMap 规定了 table 的大小必须是2的幂次方2.3 源码分析1.set(T value)set源码分析小结2.get()get图解get源码分析小结3.remove()remove源码分析小结3.再谈引用4.ThreadLocal使用场景5.ThreadLocal使用示例5.1 使用共享变量方式5.2 使用ThreadLocal方式6.谈谈原创 2020-05-07 17:29:33 · 878 阅读 · 0 评论 -
【Java面试题】有三个线程 t1,t2,t3,怎么确保它们按顺序执行?
有三个线程 t1,t2,t3,怎么确保它们按顺序执行原创 2021-10-28 16:30:05 · 5104 阅读 · 18 评论 -
【Java面试题】线程的生命周期包括哪几个阶段?
面试官:您知道线程的生命周期包括哪几个阶段?应聘者:线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。新建:就是刚使用new方法,new出来的线程;就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;阻塞:在运行状态的时候,可能因为某些原因导致运行状态的线程变成了阻塞状态,比如sleep()、wait()之后线程就处于了阻塞状转载 2020-08-10 10:55:20 · 6874 阅读 · 4 评论 -
sleep() 方法在synchronized代码块 里/外的区别
多线程笔记(十五):前言 sleep() 休眠,在 synchronized{...}同步代码块 里/外 执行,有着千然之别,接下来我们以实际例子来介绍一下他们之间又如何差别。 本例中 TimeUnit.SECONDS.sleep(1) 与 Thread.sleep(1000) 都是休眠 1s,前者只是对后者进行了一层封装。前者底层的实现还是调用的后者。实例1.sl...原创 2019-12-20 10:35:13 · 2891 阅读 · 2 评论 -
wait()/notify()/notifyAll() 的用法
多线程笔记(十):wait()方法: 该方法用来使得当前线程进入等待状态,直到接到通知或者被中断打断为止。 在调用 wait() 方法之前,线程必须要获得该对象的对象级锁;换句话说就是该方法只能在同步方法或者同步块中调用,如果没有持有合适的锁的话,线程将会抛出异常 IllegalArgumentException。调用 wait() 方法之后,当前线程则释放锁。notify()方...原创 2019-12-24 09:19:17 · 1973 阅读 · 0 评论 -
JUC 之 Condition 使用 + 原理分析
多线程笔记(十七):前言 在多线程笔记(十):wait()/notify()/notifyAll() 的用法中,我们有介绍了 wait()、notify()方法的使用。 在使用 Lock 锁之前,我们使用最多的同步方式就是 synchronized 关键字来实现同步方式了。然后配合 Object 的 wait()、notify()、notifyAll()方法,来实现线程的等待、唤醒...原创 2019-12-31 13:54:26 · 1855 阅读 · 0 评论