Administrator
发布于 2024-10-26 / 2 阅读
0

锁的类型

悲观锁:就像是担心别人会抢你的东西,所以一开始就紧紧抓住不放Synchronized 和 lock 接口;适用情况:适用于临界区持锁时间比较长的情况,悲观锁可以避免大量的无用自旋等消耗,典型情况:1.临界区有IO操作;2.临界区代码复杂或者循环量大;3.临界区竞争非常激烈。

乐观锁:相信别人不会和你抢,只有在最后才检查是否真的有人抢了原子类、并发容器;适用于并发写入少,大部分都是读取的场景,不加锁的能让读取性能大幅提高。

可重入锁:允许同一个线程多次获得同一把锁的锁机制。如果一个线程已经持有了锁,它可以再次尝试获取这把锁而不会造成死锁。

非可重入锁:不允许同一个线程多次获取同一把锁。如果一个线程试图获取一个它已经持有的锁,它将被阻塞,直到它释放这把锁。

公平锁:保证线程获取锁的公平性,避免“饥饿”现象,按照线程请求的顺序来分配锁。

非公平锁:线程获取锁的顺序是不确定的,哪个线程先抢到锁,哪个线程就先执行。

共享锁:共享锁允许多个线程同时访问同一个资源,但只允许读取,不允许修改。如果一个线程想要写入资源,它必须获取排它锁。

排它锁当一个线程获得了排它锁,它就独占了这个资源,其他任何线程都不能访问这个资源,直到持有锁的线程释放它。

自旋锁当一个线程尝试获取一个已经被其他线程持有的锁时,它不会放弃CPU资源,而是在原地“自旋”,不断检查锁是否可用。适用于多核服务器,在并发度不是特别高的情况下,比阻塞锁的效率高。适用于临界区比较短小的情况。

阻塞锁当一个线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞(即进入睡眠状态),直到锁变得可用。

可中断锁一种在等待锁的过程中可以响应中断的锁机制。