Java多线程笔记(整理中)

  • JVM起线程,与系统内核线程 1:1(golang时M:N)

  • 关键字 :synchronized

    • 锁的四种状态(锁升级的过程)

      • new(没有锁)--->偏向锁--->轻量级锁--->重量级锁

    • 可锁对象: 对象(包括this), method

  • 偏向锁(加标签,不用抢,偏向第一个访问的线程)

    • 节约锁竞争损耗,只有一个带synchronized关键字线程访问

    • 只要有第二个线程竞争,锁就升级为轻量级锁

  • 轻量级锁(自旋锁):忙等待(持续消耗系统CPU资源,轻量级效率不一定更高)

    • JUC包--CAS 实现(关键字: AtomicInteger。。。)

      • 含义:CompareAndSwap/CompareAndExchange 比较并交换

      • 修改值的时候的原子性问题(操作不可分割,由native调用C++,最终实现汇编lock cmpxchg指令)

      • ABA问题:比较时值还是预期,但已经经历过变成B再变回A的过程,可以加版本号解决

    • 自旋锁达到某个次数,升级为重量级锁

  • 重量级锁:进队列等待(由操作系统调度)

  • JSR内存屏障

    • LoadLoad屏障

    • StoreStore屏障

    • LoadStore屏障

    • StoreLoad屏障

    As if serial ---> 不论怎样乱序执行,单线程执行结果不变

  • 关键字 : volatile

    • 保证线程可见性

    • 保证指令有序性(依靠内存屏障, 禁止指令乱序执行)

  • JOL(Java Object Layout)Java对象布局

    <!-- https://mvnrepository.com/artifact/org.openjdk.jol/jol-core -->
    <dependency>
        <groupId>org.openjdk.jol</groupId>
        <artifactId>jol-core</artifactId>
        <version>0.14</version>
        <scope>provided</scope>
    </dependency>
    • new Object()获得的实例,占16字节(16 bytes),内存布局如下, 前两部分为对象头

      • MarkWord(8bytes)----对象上锁就是修改对象实例的MarkWord,标记上锁信息

        • 锁信息

        • GC---垃圾回收信息

        • hashcode

      • Class Pointer(默认4 bytes,如果JVM配置未压缩指针,为8字节)----类型指针指向object.class

      • instance data----实例数据

      • padding----对齐,为了让字节数被8整除而进行补位

  • 缓存

    • 缓存行(cache line): 按照工业实践,一般为64字节

    • MESI (Intel芯片的缓存一致性协议)

      • Modified 修改, Exclusive 独占, Shared 共享, Invalid 失效

      • cpu每个cache line

  • 对象创建过程 (因为CPU乱序执行,不保证2,3步先后顺序,* 所以DCL(Double check lock必须用volatile关键字))

    1. [半初始化]new指令在堆(Heap)中开辟内存空间,此时成员变量为默认值,如数值型为0,浮点型为0.0等

    2. dup指令复制一份指针为下一个指令消耗做准备

    3. invokespecial指令调用构造初始化,此时成员变量获得初始值

    4. astore指令 将栈(stack)中对象与堆(Heap)内存数据建立关联

    5. return指令 new方法结束

  • 阻塞队列 TransferQueue

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值