深入并发编程
文章平均质量分 73
深入并发编程
修小修
这个作者很懒,什么都没留下…
展开
-
深入并发编程——缓存伪共享问题
Cache Line 是【已失效】状态,另外由于 1 号核心的 Cache 也有此相同的数据,且状态为【已修改】,所以要先把 1 号核心的 Cache 对应的 Cache Line 写回到内存中,然后 2 号核心再从内存中读取 Cache Line 大小的数据到 Cache 中,最后把变量修改到 2 号核心的 Cache 中,并将状态修改为【已修改】状态。CPU 从内存中读取数据到 Cache 的时候,并不是一个字节一个字节读取,而是一块一块的方式来读取数据的,这一块一块的数据被称为 CPU Line。转载 2022-09-08 16:06:03 · 211 阅读 · 0 评论 -
深入并发编程——线程状态
(4)箭头 3:线程调用 join 方法后,调用 join 的线程会进入 WAITING 状态(注意是调用时所处的线程而不是 join 针对的线程)。(2)RUNNABLE 状态:线程处于运行状态,可运行状态以及阻塞状态(该阻塞状态为操作系统层面的阻塞,如 BIO 读写文件,这时该线程实际不会用到CPU,会导致线程上下文切换,进入阻塞状态)。(2)可运行状态(就绪状态):指该线程已经被创建,已经与操作系统关联,等待 CPU 调度。(3)运行状态:获取了 CPU 时间片正在执行的状态。...原创 2022-08-26 18:51:08 · 122 阅读 · 0 评论 -
深入并发编程——共享模型之管程(悲观锁)
(2)其它线程使用该对象使偏向锁升级为轻量级锁(注意此时的条件是有多个线程使用共享资源但是没有产生竞争,即虽然多个线程访问了共享资源但是使用时间是叫错开的,如果没有交错开发生了竞争则会直接进入重量级锁阶段,因为竞争的线程需要队列阻塞),即Thread0 当给一个对象加了偏向锁后,Thread1 在其运行结束使用共享资源,就会将偏向状态改为不可偏向,MarkWord 后三位由 101 设为 001,前面的偏向线程信息置为 0。Monitor 是操作系统层面的,本身存在很多的 Monitor,初始。...原创 2022-08-26 21:16:38 · 205 阅读 · 0 评论 -
深入并发编程——线程运行原理
当线程上下文切换发生时,需要由操作系统保存当前线程的状态,并恢复另一个线程的状态,Java 中对应的概念就是程序计数器,它的作用是记住下一条jvm 指令的执行地址,是线程私有的。(4)运行到某一函数时在虚拟机栈中创建一个新的栈帧,传入参数以及函数内定义的局部变量会存放在局部变量表中,局部变量表在栈帧创建时就会将相关内存分配好。(3)在虚拟机栈中创建 main 函数的栈帧,栈帧中包括局部变量表,返回地址,锁记录,操作数栈等。(2)每个线程只能有一个活动栈帧,对应着当前正在执行的方法。...原创 2022-08-26 18:36:47 · 159 阅读 · 0 评论 -
深入并发编程——死锁活锁和饥饿
意思是在进程执行之前就申请需要的全部资源,直至所有的资源全部获得后才开始执行,如果有一个资源不能获得,则也不给该进程分配其他的资源。(2)破坏不可剥夺条件:指当某进程获得了部分资源,但得不到其他资源,就释放已获得的资源,但是只适用于内存和处理器资源。(3)破坏循环等待条件:给系统的所有资源编号,规定进程所请求的资源顺序必须按照资源的编号依次进行。(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。(3)不可剥夺条件:进程获得的资源,在未完全使用完之前不能强行剥夺。......原创 2022-08-26 21:27:05 · 117 阅读 · 0 评论 -
深入并发编程——AQS框架
AQS队列同步器(AbstractQueuedSynchronizer),是Java提供的用来构建锁或者其他同步组件的基础框架。它使用了一个int的成员变量表示同步状态,通过内置的FIFO队列(CLH队列)来完成资源获取线程的排队工作。...原创 2022-08-28 14:52:44 · 175 阅读 · 0 评论