锁策略--
文章目录
- 乐观锁和悲观锁
- 轻量锁和重量锁
- 自旋锁和挂起等待锁
- 读写锁和互斥锁
- 可重入锁和不可重入锁
- 公平锁和非公平锁
乐观锁和悲观锁
乐观锁在执行任务前预期竞争不激烈,就先不添加锁等到了发生了真实的锁竞争再进行锁竞争
乐观锁适用于锁竞争不激烈的情况下
悲观锁在执行任务前预期竞争激烈,直接添加锁再执行任务
悲观锁适用于锁竞争激烈的情况下
轻量锁和重量锁
轻量级锁:加锁过程比较简单,用到的资源比较少,用户态的操作(java层面就可以完成加锁)
重量级锁:加锁过程比较复杂,用到的资源比较多,典型的是内核态的一些操作
JVM 会根据实际的运行情况,自动选择合适的锁类型。 开发者不需要手动指定使用哪种锁。 但是,了解轻量级锁和重量级锁的原理,可以帮助我们更好地理解 synchronized 的性能特点,并编写更高效的并发代码。
自旋锁和挂起等待锁
自旋锁:不停地检查锁是否被释放,一旦被释放就直接获取锁资源
挂起等待锁:阻塞等待,等待被唤醒
读写锁和互斥锁
读写锁分为读锁和写锁
读操作时加读锁(共享锁),同时加锁互不影响,多个锁可以共存
写操作时加写锁(排他锁),不能同时加锁,只允许一个写锁执行任务
读锁与读锁可以共存
读锁与写锁不可以共存
写锁与写锁不可以共存
互斥锁是一种最基本的锁机制,在任何情况下保证只有一个线程可以持有锁,并访问被保护的共享资源,其他线程必须保证锁释放后才能去竞争锁
可重入锁和不可重入锁
可重入锁:对一把锁连续加锁(连续加锁也需要连续解锁)不形成死锁 可重入锁是指,当一个线程已经获取了某个锁之后,可以再次获取同一个锁,而不会被阻塞。 也就是说,同一个线程可以多次进入被该锁保护的同步代码块。
不可重入锁是指,当一个线程已经获取了某个锁之后,如果再次尝试获取同一个锁,则会被阻塞,即使该锁的持有者是当前线程。
公平锁和非公平锁
公平锁:当两个线程竞争锁时先要求锁的线程获得锁
非公平锁:允许线程在获取锁时不遵循请求顺序。也就是说,如果一个线程在锁可用时,它可以直接获取锁,而不必等待其他线程释放锁。这种策略可能导致某些线程长时间得不到锁(饥饿现象)。