zoukankan      html  css  js  c++  java
  • 听说你知道什么是锁 --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 线程阻塞,响应时间慢 吞吐量大
  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/adrien/p/11063391.html
Copyright © 2011-2022 走看看