java中的各种锁简介

java中的各种锁

  1. 乐观锁 VS 悲观锁

    • 概念

      • 乐观锁是指默认认为在操作数据的时候不会有别的线程来干扰,所以不会添加锁,只是在更新的时候,需要检查数据有没有别的线程对这个数据进行更新,如果进行了更新,那么我就需要进行一系列其他的操作来实现(报错或者重试),如果没有被其他的线程更新,那么我直接写入就可以了
      • 悲观锁就跟我们平时使用的差不多了,synchronized 和Lock类中都是悲观锁,也就是说悲观锁默认在自己使用数据的时候一定会有别的线程来修改,所以需要加锁来实现

      乐观锁在java中通过使用无锁编程来实现,最常用的就是CAS算法,是一种原子递增操作,自旋

      一般情况下,我们可以看到

      • 悲观锁一般用于写操作比较多的地方
      • 乐观锁一般用于读操作比较多的地方
  2. 自旋锁 VS 适应性自旋锁

    在java中线程之间的唤醒或阻塞是需要CPU的调度的,所以我们要尽可能的减少CPU的浪费,但是还需要尽量提高CPU的利用率,所以就有了自旋锁和非自旋锁

    • 自旋锁:当一个线程想要访问数据的时候,但是这个数据正在被别的线程占据,所以我们需要等待,但是不进入阻塞休眠状态,而是在那里自旋(自旋的意思就是一个死循环,在里面无限期的等待资源),这样就减少了CPU唤醒线程的开销
    • 非自旋锁:当一个线程想要访问数据,但是却被占据了,这个时候不进行自旋,而是直接进入到休眠状态。

    自旋锁适用于用户操作的时间短,也就是操作数据的时间很短的情况下,而非自旋锁适用于用户操作数据的时间长的情况下

    自旋的实现原理也是CAS

  3. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁

    • Monitor 可以理解为一个同步工具或者一种同步机制,通常被描述为一个java对象,在java中每一个内部的对象都有一把看不见的锁,叫内部锁或monitor
    • 无锁是指没有对资源进行锁定,所有的线程访问并修改同一个资源,但是只有一个线程能够成功,无锁使用的是CAS的实现,原子操作,如果别的线程灭有获得锁,那么就在循环尝试获取这个值,无锁的特点就是效率高
    • 偏向锁:顾名思义,一定是偏向于某一个线程,一般用于只有一个线程的时候,目标就是只有一个线程执行时性能高,所以也就是说只要一个线程获得了这个锁,那么就会一直归这个线程所有,当有其他的线程来竞争锁的时候,这个时候我们才会释放偏向锁
    • 轻量级锁:当锁是偏向锁的时候,被另外的线程访问,这个时候偏向锁就升级成为了轻量级锁,也就是说这个时候只有一个线程持有锁,访问数据区,但是其他的线程都在那里自旋,尝试获得锁
    • 重量级锁:当一个线程持有锁的时间过长,其他的线程在自选时候达到了一定的次数就会进入阻塞状态(为了减少CPU的开销),这个时候轻量级锁升级为重量级锁。sync使用的就是重量级锁,使用monitor实现,而monitor使用的是底层的Mutex LOCK来实现的
  4. 公平锁 VS 非公平锁

    这个在我的上一篇博客中讲到,也写明了原理,讲的比较详细

  5. 可重入锁 VS 非可重入锁

    java中的 ReentrantLock和synchronized 都是重入锁

    • 重入锁:是指在同一个类或者对象中,可以共享一把锁,也就是说我们可以想象成一个对象拿到了这个锁,那么这个锁中的所有的方法都默认拥有了这个锁

    • 不可重入锁:就是指即使是同一个对象,但是也要再次获取锁

      但是这里有一个问题,也就是说现在如果我一个对象中的方法一拿到了这个锁,操作同步数据,但是我方法一调用了方法二,方法二也需要获取锁,但是这是一个不可重入锁,所以就陷入了死锁的状态

  6. 独享锁 VS 共享锁

    独享锁和共享锁同样是一种概念。我们先介绍一下具体的概念,然后通过ReentrantLock和ReentrantReadWriteLock的源码来介绍独享锁和共享锁。

    独享锁也叫排他锁,是指该锁一次只能被一个线程所持有。如果线程T对数据A加上排它锁后,则其他线程不能再对A加任何类型的锁。获得排它锁的线程即能读数据又能修改数据。JDK中的synchronized和JUC中Lock的实现类就是互斥锁。

    共享锁是指该锁可被多个线程所持有。如果线程T对数据A加上共享锁后,则其他线程只能对A再加共享锁,不能加排它锁。获得共享锁的线程只能读数据,不能修改数据。

    独享锁与共享锁也是通过AQS来实现的,通过实现不同的方法,来实现独享或者共享。

原创文章 57 获赞 9 访问量 5951

猜你喜欢

转载自blog.csdn.net/Cscprx/article/details/103957377
今日推荐