• 听说你知道什么是锁 --JAVA


    I、java中的锁

    1.1 什么是锁

    ​ 在计算机科学中,锁(lock)与互斥(mutex)是一种同步机制,用于在许多线程执行时对资源的限制。

    ​ 锁通常需要硬件支持才可以有效实施。这种支持通常采用一个或多个原子指令,测试单个线程是否空闲。

    1.2 锁的三个概念

    1. 锁开销:就是完成一个锁可能额外耗费的资源,比如一个周期所需要的时间,内存空间。
    2. 锁竞争:一个线程或进程,要获取另一个线程或进程所持有的锁,边会发生锁竞争。锁粒度越小,竞争的可能约小。
    3. 死锁:互相锁住了
    

    2 锁的分类

    2.1 独享锁/共享锁

    ​ 我私底下更想将其称作为,开源锁和闭源锁。好了我觉得说到这里可以了。

    2.2 互斥所/读写锁

    ​ 互斥所与读写锁是狭义的说法。ReentrantLock就是互斥锁也是独享锁,ReadWriteLock就是读写锁也是共享锁。

    独享与共享是被AQS(AbstractQueuedSynchronizer)定义的,

    2.3 锁升级/所降级

    低于16位属于写锁,高于16位属于读锁

    2.4 公平锁/非公平锁

    公平锁是按照线程的申请顺序来进行的

    非公平锁是按照优先级进行,所以可能会差生饥饿现象

    1. RenntranLock 而言,默认是非公平,但也可以是公平锁。通过构造函数指定。非公平锁的吞吐量就是比公平锁大。
    2. Synchronized也是一种非公平锁。由于没有AQS,所以 没可能是公平锁

    2.5 可重入锁

    也称递归锁,再同一线程的外层方法获取锁的时候,在进入内层方法自动获取锁。

    ReentrantLock 和 Synchronized都是可重入锁。可重入锁一个好处是在一定程度上避免死锁。

    2.6 乐观锁/悲观锁

    这两个并没有特定的类型,而是在看待并发之角度

    悲观锁认为存在很多并发操作,采取加锁措施,不加锁一定会有问题。

    乐观锁认为不存在很多并发操作就没必要加锁

    2.7 分段锁

    分段锁也是一种锁设计,而不是特定的锁。比如ConcuttenHashMap通过分段锁来实现高并发

    2.8 自旋锁

    自旋锁是指试探资源的线程并不阻塞线程,而是采取循环的方式尝试获取线程,好处是减少上下文的切换,缺点是一直占用CPU

    2.9 偏向锁/轻量级锁/重量级锁

    优点 缺点 适用场景
    偏向锁 加锁解锁无需额外的消耗 如果存在锁竞争,则存在锁撤销的消耗 只有一个线程访问同步方法快的场景
    轻量级锁 竞争的线程不会存在阻塞,提高了程序的响应速度。 若始终得不到锁竞争的线程使用自旋会消耗CPU 同步块执行的速度非常的快
    重量级锁 线程使用者不会自旋,不会消耗CPU 线程阻塞,响应时间慢 吞吐量大
  • 相关阅读:
    机器学习面试
    网易有道2017内推编程题2道
    老曹眼中的网络编程基础
    MySQL索引背后的数据结构及算法原理
    [oracle] oracle-ibatis-整理
    [oracle] oracle-myibatis-整理
    [mysql] mysql-myibatis-整理
    [JS] selector 背景选择器
    [android] AndroidManifest.xml 详解
    [Eclipse] 项目编码
  • 原文地址:https://www.cnblogs.com/adrien/p/11063391.html
Copyright © 2020-2023  润新知