美文网首页
多线程笔记-锁(待续)

多线程笔记-锁(待续)

作者: 清蒸三文鱼_ | 来源:发表于2020-11-27 11:34 被阅读0次

    概述

    CAS算法

    一般情况下是一个自旋操作,即不断的重试

    自旋锁

    《 面试必备之深入理解自旋锁》

    http://blog.leanote.com/post/medusar/%E8%87%AA%E6%97%8B%E9%94%81

    自适应, 可重入和不可重入,优缺点(公平性,上下文切换,cpu使用率)

    定义

    是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。
    获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。

    它是为实现保护共享资源而提出一种锁机制。其实,自旋锁与互斥锁比较类似,它们都是为了解决对某项资源的互斥使用。无论是互斥锁,还是自旋锁,在任何时刻,最多只能有一个保持者,也就说,在任何时刻最多只能有一个执行单元获得锁。但是两者在调度机制上略有不同。对于互斥锁,如果资源已经被占用,资源申请者只能进入睡眠状态。但是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,”自旋”一词就是因此而得名。

    busy_waiting

    线程同步的实现机制

    第一种线程同步机制:只利用一个全局变量来判断是否有线程正在使用critical section,这样就有可能出现,两个线程同时判断当前没有线程正在使用critical section的情况,从而同时进入了critical section。
    实际结果输出:偶尔出现加减交替的情况,即偶尔出现了两个线程同时进入critical section的情况。

    第二种线程同步机制:在每个线程中都判断了另一个线程是否正在使用critical section。
    实验结果输出:基本上第一个线程执行一次就到第二个线程执行一次。

    critical section

    是每个线程中访问临界资源的那段代码,不论是硬件临界资源,还是软件临界资源,多个线程必须互斥地对它进行访问,临界资源是一次 仅允许 一个线程使用的共享资源

    多个线程中涉及到同一个临界资源的临界区称为相关临界区。
    线程进入临界区的调度原则是:
    ①如果有若干线程要求进入空闲的临界区,一次仅允许一个线程进入。
    ②任何时候,处于临界区内的线程不可多于一个。如已有线程进入自己的临界区,则其它所有试图进入临界区的线程必须等待。
    ③进入临界区的线程要在有限时间内退出,以便其它线程能及时进入自己的临界区。
    ④如果线程不能进入自己的临界区,则应让出CPU,避免线程出现“忙等”现象。

    如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。

    自旋锁与互斥锁

    自旋锁与互斥锁都是为了实现保护资源共享的机制。
    无论是自旋锁还是互斥锁,在任意时刻,都最多只能有一个保持者。
    获取互斥锁的线程,如果锁已经被占用,则该线程将进入睡眠状态;获取自旋锁的线程则不会睡眠,而是一直循环等待锁释放。

    乐观锁

    ABA是乐观锁常见的问题

    偏向锁

    死磕Synchronized底层实现--偏向锁

    Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。
    偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在运行过程中,同步锁只有一个线程访问,不存在多线程争用的情况,则线程是不需要触发同步的,这种情况下,就会给线程加一个偏向锁。
    如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会消除它身上的偏向锁,将锁恢复到标准的轻量级锁。

    重量级锁

    Mutex Lock

    上篇文章中向大家介绍了Synchronized的用法及其实现的原理。现在我们应该知道,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock来实现的。而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。JDK中对Synchronized做的种种优化,其核心都是为了减少这种重量级锁的使用。JDK1.6以后,为了减少获得锁和释放锁所带来的性能消耗,提高性能,引入了“轻量级锁”和“偏向锁”。

    重量级锁、轻量级锁和偏向锁之间转换

    JAVA对象结构-MarkWord

    Java对象结构与锁实现原理及MarkWord详解
    https://blog.csdn.net/scdn_cp/article/details/86491792


    相关文章

      网友评论

          本文标题:多线程笔记-锁(待续)

          本文链接:https://www.haomeiwen.com/subject/rcqxwktx.html