![](https://img-blog.csdnimg.cn/20190927151124774.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
并发编程
文章平均质量分 61
java多线程,对应《Java多线程编程核心技术》第二版
追風者0x8ffd98a8
只想见见天地。
展开
-
线程池的处理流程于核心参数
线程池的处理流程于核心参数线程池的处理流程如下:线程池判断核心线程池里的线程是否都在执行任务。如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一流程。线程池判断工作队列是否已满。如果工作线程队列没有满,则将新提交的任务存储在这个工作队列里。如果工作队列满了,则进入下一流程。线程池判断线程池的线程是否都处于工作状态。如果没有,则创建一个新的工作线程来执行任务。如果满了,则交给饱和策略来处理这个任务。ThreadPoolExecutor 执行 execute原创 2022-02-26 11:45:11 · 221 阅读 · 0 评论 -
线程状态的转换
线程状态的转换Java 中有六种状态:RUNNABLE(运行状态),WAITING(等待状态),READY(就绪状态),TIMED_WAITING(超时等待),BLOCKEND(阻塞状态),TERMINATED(终止状态)。RUNNING(运行状态) 与 READY(就绪态)根据系统调用进行切换。WAITING(等待状态)切换到 READY(就绪态):Object.wait()、Object.join()、LockSupport.park()。READY/RUNNING(就绪/运行态)切换到原创 2022-02-26 11:02:56 · 129 阅读 · 0 评论 -
线程间通信模型
线程间通信volatile 和 synchrnoized 关键字进行线程通信等待/通知机制volatile 和 synchrnoized 关键字进行线程通信volatile 关键字通过内存原语实现线程间通信(隐式通信,写后将其他线程本地内存无效化)。synchrnoized 关键字是对对象的监视器(monitor)进行上锁,此方式是排他的。对象、监视器、同步对象和执行线程的关系:任意线程对 Object 的访问,首先要获得 Object 的监视器。如果获取失败,线程进入同步队列等待,线程状态变为原创 2022-02-26 10:20:50 · 159 阅读 · 0 评论 -
面试问Java并发编程还不了解 AQS?一文搞懂 AQS 源码
面试问Java并发编程还不了解AQS?一文搞懂AQS源码!AQS是什么?AQS三大基石AQS源码之路AQS是什么?AQS全称为AbstractQueueSynchronizer,顾名思义——抽象队列同步器,是ReentrantLock、ReentrantReadWriteLock等锁的底层实现。抽象队列同步器的工作原理是将工作线程封装为Node节点,当线程竞争锁时,通过CAS方式来设置state数值,当state数值大于等于1时,工作线程无法争抢锁,进入双向队列等待;当工作线程工作完毕时,通过CAS操原创 2022-02-26 09:17:32 · 95 阅读 · 0 评论 -
final 域的内存语义
final 域的内存语义对于 final 域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个 final 域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两操作不能重排序(保证在构造函数中对 final 域的初始化)。即构造函数在给 final 域初始化时,不能重排序到对象赋值的后面,会导致并发时,final 域数据读取不到。初次读一个包含 final 域的对象的引用,与随后初次读取这个 final 域,这两个操作之间不能重排序(必须等包含 final 域的对象的引用完毕后,才能原创 2022-02-26 08:21:30 · 88 阅读 · 0 评论 -
volatile 的内存语义
volatile 的内存语义volatile 写--读建立的 happens-before 关系volatile 的内存语义volatile 内存语义的实现总结volatile 修饰的变量具有以下特性:可见性。对一个 volatile 变量的读,总是能看到任意线程对这个 volatile 变量最后的写入。原子性。对任意单个 volatile 变量的读/写具有原子性(除去 double 和 float 类型变量,因为这两种类型变量为 64 位类型)。一个 volatile 变量的单个读/写操作,与原创 2022-02-26 07:49:26 · 67 阅读 · 0 评论 -
并发基础之Java内存模型、指令重排与数据正确性
并发基础之Java内存模型、指令重排与数据正确性Java 内存模型指令重排数据正确性数据依赖性重排序对多线程的影响操作依赖性顺序一致性JMM 对数据安全性的保证在不改变程序执行结果的前提下,尽可能提高并行度。Java 内存模型JMM 就是 Java 内存模型,由于 Java 默认支持多线程操作,每个线程中都有自己的缓存,即下图中的本地内存(本地内存并不真实存在)。JMM 通过控制主内存与每个线程的本地内存之间的交互,实现内存可见性的保证。指令重排重排序分为三种类型,分别为编译器优化的重排序、指原创 2022-02-26 07:49:01 · 263 阅读 · 0 评论 -
Synchronized 的实现原理
Synchronized 的实现原理synchronized 关键字,是隐式上锁,可以修饰方法或代码块。JVM 基于 Monitor 对象来实现同步方法同步和代码块同步的。代码块同步是使用 monitorenter 和 monitorexit 指令实现的。任何一个对象都与 moniter 关联,当且仅当一个 moniter 被持有后,它将处于锁定状态。线程执行到 monitorenter 指令时,尝试获取对象所对应的 monitor 的所有权,即尝试获取对象的锁。synchronized 使用的原创 2022-02-26 07:48:43 · 56 阅读 · 0 评论 -
原子操作的实现原理
原子操作的实现原理与CAS实现原子操作原子操作表示操作是一个整体,不可再分。在并发场景下,如果无法保证某些操作是原子的,数据就无法一致,导致系统不可用。处理器保证原子操作处理器层面有两种方式实现原子操作:通过总线锁来保证原子性。总线锁就是使用处理器提供的一个 LOCK # 信号,当一个处理器在总线上输出此信号时,其他处理器的请求就会被阻塞住,该处理器可以独占贡献内存。但此种方式,开销比较大,在锁总线期间,其他处理器无法操作其他内存地址的数据。通过缓存锁定来保证原子性。使用“缓存锁定”的方式来原创 2022-02-26 07:48:34 · 359 阅读 · 0 评论 -
数据可见性理论之 happens-before 规则
数据可见性理论之 happens-beforehappens-before 要求前一操作 A 的执行结果对后一操作 B 可见,且 A 操作按顺序排在 B 操作之前(但不意味 A 操作必须在 B 操作前执行)。happens-before 规则保证线程间的内存可见性。...原创 2022-02-26 07:48:23 · 197 阅读 · 0 评论 -
并发编程基石之内存屏障
并发编程基石之内存屏障屏障类型指令实例说明意义LoadLoad BarriersLoad1; LoadLoad; Load2确保 Load1 数据的装载优先于 Load2 及所有后续装载指令的装载保证数据的一致性(防止重排序导致数据执行错误)StoreStore BarriersStore1; StoreStore; Store2确保 Store1 数据对其他处理器可见(刷新到内存)先于 Store2 及所有后续存储指令的存储确保 Store2 准确获取 Stor原创 2022-02-25 11:45:59 · 60 阅读 · 0 评论 -
并发访问变量之synchronized与volatile
并发访问变量之synchronized与volatilesynchronizedsynchronized锁的种类对象锁——synchronized修饰普通方法、synchronized(this)和synchronized(Object)类级锁——synchronized修饰静态方法和synchronized(class)对象级锁与类级锁不同synchronized锁的属性volatile关键字synchronizedsynchronized可以用来保障原子性、可见性和有序性。原子性:即操作为一个整体原创 2021-11-10 18:29:22 · 743 阅读 · 0 评论 -
Java线程API,一文总结
Java线程API,一文总结线程的创建继承Thread类实现Runnable接口两种方式的区别比较对线程并发安全问题的处理Java线程APIcurrentThread()start()与run()isAlive()sleep()yield()线程停止使用interrupt方法中断线程interrupted()与isInterrupted()的区别异常法stop()暴力停止线程return终止法暂停线程资源独占数据不完整线程的创建继承Thread类可以通过继承Thread类,再通过new创建对象来创建线原创 2021-10-31 18:16:35 · 243 阅读 · 0 评论