并发编程-锁的分类

锁的分类

可重入锁&不可重入锁

  1. 可重入:当一个线程获取某个锁后,再次获取这个锁的时候是可以直接拿到的。
  2. 不可重入:当一个线程获取某个锁之后,再次获取这个锁的时候拿不到,必须等自己先释放锁再获取。
  3. synchronized、ReentrantLock、ReentrantLockReadWriteLock都是可重入锁。

乐观锁&悲观锁

  1. 乐观锁:当一个获取不到锁时,可以再次让CPU调度,重新尝试获取锁
  2. 悲观锁:当一个线程获取不到资源时,线程被挂起(BLOCKED,WAITING状态)。注意:线程挂起涉及到内核态和用户态的切换,比较消耗资源
  3. 用户态:JVM可以自行执行的指令,不需要操作系统执行。
  4. 内核态:JVM不可以自行执行,需要操作系统执行。
  5. synchronized、ReentrantLock、ReentrantLockReadWriteLock都是悲观锁,而Java中的CAS操作是一种乐观锁的实现。

共享锁&互斥锁

  1. 互斥锁:同一时间点只能有一个线程持有互斥锁。
  2. 共享锁:同一时间可以允许多个线程同时持有共享锁。
  3. synchronized和ReentrantLock是互斥锁。
  4. ReentrantLockReadWriteLock在读锁时候是共享锁,写锁时候是互斥锁。

公平锁&非公平锁

假设A线程持有锁,B线程正在等待锁,这个时候C线程来了

  1. 公平锁:C线程必须再B线程之后排队,必须等B线程获取锁或取消排队后C线程才能尝试获取锁。
  2. 非公平锁:C线程无视B的存在,先尝试获取锁,如果拿到锁就可以去执行业务逻辑,如果没拿到还是要去B线程后排队,等待B线程拿到锁,才能尝试获取锁
  3. synchronized是非公平锁
  4. ReentrantLock、ReentrantLockReadWriteLock可以是公平锁,也可以是非公平锁。

相关推荐

  1. 并发编程-分类

    2024-07-16 08:20:04       30 阅读
  2. 并发编程各类

    2024-07-16 08:20:04       25 阅读
  3. 并发编程

    2024-07-16 08:20:04       50 阅读
  4. C++ 并发编程 |

    2024-07-16 08:20:04       44 阅读
  5. 并发

    2024-07-16 08:20:04       38 阅读
  6. go语言并发编程(二)——

    2024-07-16 08:20:04       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 08:20:04       70 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 08:20:04       74 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 08:20:04       62 阅读
  4. Python语言-面向对象

    2024-07-16 08:20:04       72 阅读

热门阅读

  1. Gmsh教程

    2024-07-16 08:20:04       31 阅读
  2. Redis是什么

    2024-07-16 08:20:04       28 阅读
  3. 机器学习——机器学习概述

    2024-07-16 08:20:04       22 阅读
  4. 深入理解 Vue.js 的生命周期:从创建到销毁

    2024-07-16 08:20:04       27 阅读
  5. 2024.7.10 day 3 比赛总结

    2024-07-16 08:20:04       21 阅读
  6. 大模型 GPT 到 GPT-3.5 知识点总结

    2024-07-16 08:20:04       23 阅读
  7. Python 和 R两者的主要区别和优缺点对比

    2024-07-16 08:20:04       26 阅读