美文网首页Java
Java锁的分类 以及应用

Java锁的分类 以及应用

作者: TZX_0710 | 来源:发表于2021-09-02 15:26 被阅读0次

    Java锁的分类

    序号 分类 应用
    1 乐观锁/悲观锁 乐观锁: CAS(Compare and Swap 比较并且替换)、悲观锁:synchronized、vector、hashtable
    2 独享锁/共享锁 独享锁:synchronized、vector、hashtable、ReentrantReadWriteLock中写锁 共享锁:ReentrantReadWriteLock中读锁
    3 互斥锁/读写锁 互斥锁: synchronized 读写锁:ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet
    4 可重入锁 可重入锁 : synchronized、Reentrantlock、Lock
    5 公平锁/非公平锁 公平锁:Reentrantlock(true) 非公平锁synchronized、reentrantlock(false)
    6 分段锁 分段锁:concurrentHashMap
    7 偏向锁/轻量级锁/重量级锁 锁优化技术
    8 自旋锁 CAS(Compare and Swap 比较并且替换)

    1.悲观锁和乐观锁

    Java中的悲观锁:synchronized修饰的方法和方法快、ReentrantLock

    悲观锁是一种悲观思想,即认为写多读少,即认为每次拿取数据的时候都会认为其他线程会修改数据,所以每次读写数据都会上锁。其他线程想读写这个数据都需要等待该线程执行完成。

    Java中的乐观锁:CAS

    乐观锁是一种乐观思想,即认为每次取数据得时候都认为别的线程不会正在修改,所以不加锁,写数据的时候判断当前值与期望值是否相等,一样则更新,否则继续进行CAS操作。

    2.独享锁和共享锁

    Java中用到的独占锁:synchronized,ReentranLock

    独占锁是一种思想:只能有一个线程获取锁,以独占的方式持有锁。和悲观锁、互斥锁同义。

    Java中用到的共享锁: ReentrantReadWriteLock

    共享锁是一种思想: 可以有多个线程获取读锁,以共享的方式持有锁。和乐观锁、读写锁同义。

    3. 互斥锁和读写锁

    Java中用到的互斥锁:synchronized

    互斥锁与悲观锁同义、独占锁同义,表示某个资源只能被一个线程访问,其他线程不能访问

    读-读互斥

    读-写互斥

    写-读互斥

    写-写互斥

    Java中用到的读写锁 :ReentrantReadWriteLock类来实现

    为了提高性能,Java提供了读写锁,在读的时候使用读锁,写的时候使用写锁,没有写的情况下,读是无阻塞,在一定程度上提高了程序的执行效率。

    读锁:允许多个线程获取读锁,可以同时访问一个资源

    写锁: 只允许一个线程获取写锁,不允许同时访问同一个资源

    4.可重入锁

    Java中的可重入锁ReetrantLock和synchronized修饰的方法或者代码段

    可重入锁是一种技术:任意线程在获取到锁之后能够再次获取该锁不产生阻塞

    可重入锁:通过组合自定义同步器来实现锁的获取和释放

    再次获取锁:识别获取锁的线程是否为当前占据锁的线程,如果是则再次获取成功,获取之后 次数累加

    释放锁:释放锁时,进行计数减1

    可重入锁:可以避免死锁。 如果重入锁加了2把,只释放了一把,程序则会卡死。如果只加了一把锁,释放多次则会产生异常 IllegalMonitorStateException

    5.公平锁和非公平锁

    Java中的公平锁: Reentrantlock(true)

    公平锁是一种思想:多个线程按照申请的顺序来获取锁。在并发环境中,每个线程会先看 此锁维护的等待队列,如果当前等待队列为空则占有,否则不为空,则加入末尾进行排队。按照FIFO的原则

    Java中的非公平锁:synchronized、reentrantlock(false)

    线程尝试获取锁,如果获取不到,则再采用公平锁的方式。多个线程锁的顺序不是按照有序的。

    优点:非公平锁的性能高于公平锁

    缺点:有可能造成线程饥饿 线程获取不到锁 在一段时间

    5.分段锁

    Java中分段锁的应用实现:ConcurrentHashMap

    ConcurrentHashMap是一个Segment数组,Segment通过集成ReentrantLock进行操作,所以每次需要加锁的操作锁住的时一个Segment,这样保证每个Segment时安全的,那么也就实现了全局安全

    6.偏向锁/轻量级锁/重量级锁

    1. 偏向锁是一种锁优化机制

      :在JDK1.6的时候加入的一种锁优化机制:在无竞争的情况下把整个同步都消除掉,连CAS都不去做了。偏是指偏心,意思是这个锁会偏向于第一个获取到它的线程。

    优点: 把整个同步都消除掉,连CAS操作都不去做了,优于轻量级锁

    缺点: 如果程序中大多数的锁都是总被多个不同的线程访问,那偏向锁就是多余的

    1. 轻量级锁是JDK6 加入的一种锁优化机制:

      优点: 如果没有竞争,通过CAS操作成功避免了使用互斥量的开销

      缺点:如果存在竞争,除了互斥量本身的开销外,还额外产生了CAS操作的开销, 因此在有竞争的情况下,轻量级锁比传统的重量级锁更慢

    2. Java中的重量级锁: synchronized

      重量级锁是一种称为: synchronized是通过对象内部的一个叫做监视器锁来实现的,监视器锁本身以来底层的操作系统的Mutex Lock来实现。

    7.自旋锁

    Java中的自旋锁:CAS操作中的比较操作失败后的自旋等待

    自旋锁是一种技术:为了让线程等待,我们只需让线程执行一个忙循环。

    自旋锁的优点:避免线程切换的开县

    自旋锁的缺点: 占用处理器的时间,如果占用时间很长,消耗处理器资源。

    相关文章

      网友评论

        本文标题:Java锁的分类 以及应用

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