• Java多线程基础知识-2


    线程的3个方法:

    Thread.sleep():当前线程睡眠多少毫秒,让给其他线程去执行。

    Thread.yield():当前线程退出一下,进入到等待队列,让其他线程执行,即让出线程一下。

    Thread.join():等待另外一个线程的结束。

    synchronized关键字:

    • 对象锁:对某个对象加锁,而不是代码
      • 锁对象不能是String常量(容易跟类库中锁对象重复)、Integer(值变会创建新的对象)、Long
    • 可重入锁:

    见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No5SynchReentrant

    • 锁异常自动释放:

    见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No6SynchExceptionRelease

    • synchronized是排队运行,即按顺序运行:

    见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No3SynchLineUp

    • synchronized使用是"对象监视器"
    • 语法:
      • synchronized同步方法
      • synchronized同步代码块
        • synchronized(this) synchronized void m()
        • synchronized(非this对象 x)
          • 在多个线程持有"对象监视器"为同一个对象的前提下,同一个时间只有一个线程可以执行synchronized(非this对象 x)同步代码块中的代码
          • synchronized(非this对象 x)与持有不同的对象监视器方法或代码块是异步的
    • synchronized static void m() 这里相当于 synchronized(T.class)
      • Class类锁与对象锁之间的异步
      • Class类可以对类所有对象实例起作用

    锁定某个对象o,如果o的属性发生变化,不影响锁的使用,但是如果o变成另一个对象,则锁定的对象发生改变,应该避免锁定对象的引用变成另外的对象。--> 解决:加final

    synchronized底层实现:

    前提:基于HotSpot实现的JVM。

    synchronized发展:

    • 早期使用重量级的系统锁
    • JDK1.6以后使用锁升级

    锁的四种状态:

    无锁状态、偏向锁状态、轻量级锁状态、重量级锁状态。

    锁的优化:

    适应性自旋锁、锁消除、偏向锁、锁粗化、偏向锁

    Mark Word:

    32位:

    偏向锁:
    • 偏向锁是在单线程执行代码块时使用的机制,如果在多线程并发的环境下(即线程A尚未执行完同步代码块,线程B发起了申请锁的申请),则一定会转化为轻量级锁或者重量级锁。
    轻量级锁(自旋锁):
    • 轻量级锁是为了在线程交替执行同步块时提高性能,而偏向锁则是在只有一个线程执行同步块时进一步提高性能。
    • 修改MarkWord(修改锁状态),拷贝MarkWord到栈的LockRecord中,使用CAS将MarkWord中的LockWord更新为指向当前线程LockRecord的指针
    • 默认自旋10次失败,升级重量级锁
    重量级锁:
    • 依赖于操作系统Mutex Lock所实现的锁我们称之为 “重量级锁”
    重量级锁、轻量级锁和偏向锁之间转换:

    锁升级的详细过程:

    底层实现:
    • Java的对象头(Mark Word)和Monitor(监视器)对象是Synchronized实现的基础。Synch基于进入和退出Monitor对象实现的同步,Synch使用的锁是存在于Java对象头中。
    • Synchronized是通过对象内部的一个叫做"监视器锁(Monitor)"来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。
    1. 字节码层面:

    访问标识(access flags):ACC_SYNCHRONIZED

    monitorenter指令 monitorexitr指令

    2. JVM层面:

    C++ 调用了操作系统提供的同步机制

    3. OS和硬件层面(了解):

    X86系统 : lock cmpxchg / xxx

    https://blog.csdn.net/21aspnet/article/details/88571740

    synchronized的经典小题:

    1. 不使用synchronized的非线程安全(线程不安全)举例:

    见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No1NonThreadSafe

    模拟银行账号:对业务写方法加锁,对业务读方法不加锁,这样行不行? -> 容易产生脏读(dirtyRead)

    见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No2DirtyRead

    2. 同步与非同步方法是否可以同时调用?

    可以

    见com.hanxiaozhang.threadbase1ndedition.synchronizedkeyword.No4SynchAndNonSynchMethod

    3. synchronized在普通方法与静态方法的区别:

    普通方法同步范围是该方法,是给对象上锁;静态方法同步范围是该方法,是给Class类上锁,这个类所有的对象竞争一把锁。

    锁:

    执行时间短(加锁代码),线程数少,用自旋锁

    执行时间长,线程数多,用系统锁(重量级锁)

    Volatile关键字:

    特点:

    • 保证线程可见性;
      • 底层实现:MESI 缓存一致性协议

    见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No1VolatileVisibility

    • 禁止指令重排序;
      • DCL单例(Double Check Lock)
      • 底层实现:内存屏障,loadfence原语指令(读屏障),storefence原语指令(写屏障)

    见com.hanxiaozhang.threadbase1ndedition.no2volatilekeyword.No2VolatileDisOrder

    底层实现:

    1. 字节码层面:

    增加访问标识(access flags): ACC_VOLATILE

    2. JVM层面:

    volatile内存区的读写都加屏障

    3.OS和硬件层面:

    使用hsdis(HotSpot Dis Assembler)工具观察,windows是由lock 指令实现 | MESI实现

    https://blog.csdn.net/qq_26222859/article/details/52235930

    Tips:

    对象初始化过程,分为三步,可能会发生重排序

    CAS(Compare And Swap):

    介绍:

    CAS(CompareAndSwap)中文意思:比较并替换,它是一种无锁算法。CAS有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。

    CAS指令执行时,当且仅当V的值与A相等时,将V修改为B,否则就什么都不做,整个CAS操作是一个原子操作。

    特点:

    CAS是原子操作,CAS具有关键字volatile读和写的内存语义。

    三大问题:

    • 循环时间长开销很大;
    • 只能保证一个变量的原子操作;
    • ABA问题。

    UnSafe类:

  • 相关阅读:
    【探索Linux】—— 强大的命令行工具 P.7(进程 · 进程的概念)
    【C++】智能指针
    2022年Android面试之Jetpack(AAC框架)篇
    ISP屏幕和LCD屏幕的区别,以及AMOLED、Super AMOLED和OLED
    NoSQL之Redis配置与优化
    【C++笔记】C++继承
    SpringBoot集成Kafka——如此简单
    GaussDB-物理、逻辑备份 使用方法和[GAUSS-53403]解决办法
    Harmony | 超好用的单细胞测序数据合并(3‘和5‘数据合并)(二)
    探索性测试的概念及方法
  • 原文地址:https://blog.csdn.net/huantai3334/article/details/139653507