| 读写锁(RWLock) |
读写锁允许多个读操作同时进行,但写操作会独占锁。读锁可以由多个线程持有,而写锁在同一时间只能由一个线程持有。 |
当系统中有大量读操作,且读操作和写操作并发不频繁时,读写锁可以提高性能。 |
| 条件锁(Condition Lock) |
条件锁是一种与线程同步相关的锁,允许线程在某些条件成立之前挂起。在Java中,通常与Object类的wait()和notify()方法一起使用。 |
当需要等待某个特定条件满足时,例如队列中的元素达到一定数量,可以使用条件锁。 |
| 分段锁(Segment Lock) |
分段锁将数据结构分成多个段,每个段有自己的锁。这样可以允许多个线程同时访问不同的段,从而提高并发性能。 |
适用于数据量较大,且对数据结构进行频繁修改的场景。 |
| 悲观锁(Pessimistic Lock) |
悲观锁在读取数据时假定数据将被修改,因此在读取前需要获取锁。这种锁通常用于避免脏读、不可重复读和幻读等问题。 |
当对数据一致性的要求较高时,可以使用悲观锁。 |
| 乐观锁(Optimistic Lock) |
乐观锁假设在读取数据期间不会有其他线程对其进行修改,因此不需要在每次读取前获取锁。而是在更新数据时检查是否有其他线程已经修改了数据。 |
当数据修改频率较低,且对数据一致性的要求不是特别高时,乐观锁可以提高性能。 |
| 自旋锁(Spin Lock) |
自旋锁是一种忙等待的锁,线程在尝试获取锁时不会立即挂起,而是不断检查锁是否可用。这种锁适用于锁持有时间很短的场景。 |
当锁的持有时间非常短,且系统资源允许线程自旋时,可以使用自旋锁。 |
| 偏向锁(Bias Lock) |
偏向锁是Java中synchronized关键字的一种优化,它允许线程在没有竞争的情况下直接使用锁。当有线程竞争时,才会转换为轻量级锁或重量级锁。 |
当大部分时间只有一个线程访问共享资源时,偏向锁可以提高性能。 |
| 轻量级锁(Lightweight Lock) |
轻量级锁在无竞争的情况下提供类似于偏向锁的性能,但在有线程竞争时,它会转换为重量级锁。 |
当线程竞争不频繁时,轻量级锁可以提高性能。 |
| 重量级锁(Heavyweight Lock) |
重量级锁在Java中通常与synchronized关键字一起使用,当多个线程竞争锁时,线程会进入等待状态,直到锁被释放。 |
当线程竞争非常激烈时,重量级锁是最后的选择,因为它会导致线程上下文切换,从而降低性能。 |