写点什么

并发编程(一)并发编程的实现原理

作者:想要飞的猪
  • 2022-11-22
    广东
  • 本文字数:1115 字

    阅读完需:约 4 分钟

一、并发编程挑战


1、上线文切换: 
cpu通过时间分片来实现单核处理器执行多线程任务,当cpu执行一个时间片之后会切换到下一个任务,但是在切换前会保存到上一个任务的状态,以便下次切换回这个任务时,可以再次加载这个任务的状态。所以任务从保存到再次加载的过程就是一次上下文切换。因为要保存和加载任务的状态信息等,所以上下文切换会影响执行多线程的执行速度。
复制代码


2、死锁:一组互相竞争资源的线程,因相互等待,导致永久阻塞的现象。


死锁的条件:
复制代码


  • 互斥条件 :共享资源 X 与 Y 只能被一个线程占用

  • 占有且等待 :线程 T1 已经取得共享资源 X,在等待共享资源 Y 的时候,不释放 X 资源。

  • 不可剥夺:其他线程不能强行抢占线程已经占有的资源

  • 循环等待:有线程相互等待 ;

  • 避免死锁:只要破坏其中一个条件即可,因为互斥条件是锁本身特性,所以只能破坏其他三个;


占有且等待 :线程一次性获取申请所有资源;


占有且等待 :在线程占有额部分资源,申请另外的资源获取不到时,则主动释放占有的资源;


循环等待:把资源排序,申请资源时可以按顺序申请


二、java 并发线程的底层实现原理


CPU 相关术语:


内存屏障(menory barriers):用于实现内存操作顺序的一组处理器指令


缓冲行(cache line):缓存中分配的最小存储单元。处理器在处理缓存时会加载整个缓存行,锁定整个缓存行(伪共享问题的存在)


1、volatile 的原理


内存的可见性


   当有volatile修饰变量时,会在编译后加上#lock 前缀指令,lock指令在多核处理器时会发生两件事:
复制代码


①、江当前处理器的额缓存行数据写回到系统内存中


②、这个写回内存的操作会使在其他缓存了该内存地址的数据无效


禁止指令重排序


在遇到lock指令时,会禁止把lock指令后的重排序到lock之前。
复制代码


2、synchronized 的实现原理与应用


2.1、 synchronized实现同步的基础:java的每个对象都可以最为锁,具体表现为“
复制代码


  • synchronized 加在普通同步方法,锁是当前对象

  • 对于静态同步方法,锁时当前类的 Class 对象。

  • 对于同步方法块,锁是 synchronized 括号中的对象

  • monitorenter 指令时在编译后插入到同步块的开始位置,monitorexit 是插入到指令的结束和异常处。任何对象都有一个 monitor 与之关联。


2.2、java 对象头


synchronized用的锁是存在java对象头里,如果对象是数组,则虚拟机用三个字宽存储对象都,非数组类型时,则用两个字宽存储对象头。在32位虚拟机中一字宽为4字节即32位。
复制代码


分为三部分:


  • Mark word 32/64 bit 默认存储对象的 hashCode、分代年龄和锁标记为

  • Class metadata address 32/64 bit 存储对象类型数据的引用指针

  • array length 32/64 bit 存储数组长度(只有对象为数组时才有)


Mark woed 存储结构


在运行期间 Mark word 里存储的数据会根据锁标志位的变化而变化,可能变化为的几种数据:

用户头像

还未添加个人签名 2020-06-05 加入

还未添加个人简介

评论

发布
暂无评论
并发编程(一)并发编程的实现原理_synchronized_想要飞的猪_InfoQ写作社区