-
内置锁(Intrinsic Lock):
也称为监视器锁(Monitor Lock),是Java中最基本的锁机制,由 synchronized 关键字实现。当一个线程进入 synchronized 代码块或方法时,会自动获取对象的内置锁,其他线程需要等待该锁释放才能访问同步代码块。
-
重入锁(Reentrant Lock):
是Java中的一种高级锁机制,它允许线程重复获取同一个锁而不会被阻塞。重入锁提供了更灵活的锁操作,支持公平性和非公平性、可中断性、定时锁等特性,可以通过 Lock 接口及其实现类(如 ReentrantLock)来使用。
-
读写锁(ReadWrite Lock):
也称为共享-独占锁,是一种特殊的锁机制,用于控制读写操作对共享资源的访问。读锁可以被多个线程同时持有,用于并发读取共享资源;写锁只能被单个线程持有,用于独占地修改共享资源。Java中的 ReadWriteLock 接口及其实现类(如 ReentrantReadWriteLock)提供了读写锁的功能。
-
条件锁(Condition Lock):
是一种线程间通信的机制,允许线程在满足特定条件时才能继续执行。条件锁通常与重入锁配合使用,通过 Condition 对象的 await() 和 signal() 方法来实现线程的等待和唤醒。
-
原子变量(Atomic Variable):
提供了一种线程安全的操作共享变量的方式,保证了对变量的操作是原子性的,不会被其他线程中断。Java 中的原子类(如 AtomicInteger、AtomicLong 等)提供了一系列原子操作,用于在多线程环境中实现安全地更新共享变量。
-
StampedLock:
是Java 8引入的一种新型锁机制,提供了乐观读锁、悲观读锁和写锁三种模式,适用于读多写少的场景,并且性能较好。
-
可重入读写锁(ReentrantReadWriteLock):
这是 ReentrantLock 和 ReadWriteLock 的组合。与 ReadWriteLock 类似,它提供了读写锁的功能,但与 ReentrantLock 类似,它也支持重入特性。
-
乐观锁(Optimistic Lock):
乐观锁不会阻塞线程,而是通过版本号等机制来判断资源是否被修改。在读取数据时,乐观锁不会加锁,而是记录数据版本号;在更新数据时,乐观锁会检查数据版本号是否发生变化,如果没有变化则更新成功,否则重新尝试。
-
悲观锁(Pessimistic Lock):
悲观锁在读取和更新数据时会加锁,阻塞其他线程对相同资源的访问。它认为资源会被其他线程修改,因此在访问资源时会先获取锁。
-
公平锁(Fair Lock):
公平锁是一种保证锁获取的顺序与线程请求的顺序一致的锁机制。在公平锁中,当一个线程请求锁时,如果当前锁被其他线程占用,则该线程会被放入等待队列中,等待其他线程释放锁后再获取锁。Java中的 ReentrantLock 类提供了公平锁的实现。
-
非公平锁(Non-Fair Lock):
非公平锁是一种不保证锁获取顺序与线程请求顺序一致的锁机制。在非公平锁中,一个线程请求锁时,如果锁当前是空闲的,则该线程可以直接获取锁,不管其他线程是否在等待获取锁。与公平锁相比,非公平锁可以提高系统的吞吐量,但可能会导致某些线程长时间等待锁的情况。
-
自旋锁(Spin Lock):
自旋锁是一种在获取锁失败时不会立即阻塞线程,而是通过循环重试获取锁的锁机制。在自旋锁中,线程会忙等待锁的释放,不断尝试获取锁直到成功。自旋锁适用于锁占用时间很短的情况,可以减少线程上下文切换的开销。在Java中,AtomicReference 和 AtomicStampedReference 提供了一种基于 CAS (Compare And Swap) 的自旋锁的实现。
-
分段锁(Segment Lock):
分段锁是一种将共享资源分成多个段,每个段上加锁的锁机制。分段锁可以减小锁的粒度,提高并发性能。在Java中,ConcurrentHashMap 就是采用分段锁实现的线程安全的 HashMap。
-
分布式锁(Distributed Lock):
分布式锁是一种在分布式系统中实现对共享资源的访问控制的锁机制。它可以确保在不同的节点上只有一个线程能够获取锁,避免了分布式环境下的并发访问问题。常见的分布式锁实现方式包括基于数据库、基于缓存、基于ZooKeeper等。
-
排他锁(Exclusive Lock):
排他锁是一种只允许一个线程访问共享资源的锁机制。与独占锁类似,但排他锁通常用于数据库系统中,用于保证事务的原子性和一致性,避免了并发访问导致的数据不一致问题。
-
共享锁(Shared Lock):
共享锁是一种允许多个线程同时访问共享资源的锁机制。与独占锁相对应,共享锁通常用于读多写少的场景,可以提高系统的并发性能。
-
互斥锁(Mutex Lock):
互斥锁是一种用于保护共享资源不被多个线程同时访问的锁机制。它是一种二进制信号量,只能有一个线程持有锁,其他线程需要等待锁的释放才能访问共享资源。
-
轻量级锁(Lightweight Lock):
是一种用于提高并发性能的锁机制,通常用于同步代码块。它采用自旋锁的方式来避免线程阻塞,只有在自旋失败时才会转为重量级锁,从而减少了线程上下文切换的开销。
-
偏向锁(Biased Locking)
是Java中一种针对同步代码块优化的锁机制。它的设计目标是在没有竞争的情况下,尽量减少锁的开销,提高程序的性能。
-
重量级锁(Heavyweight Lock)
是Java中一种用于保护共享资源的锁机制,也称为互斥锁。相对于轻量级锁和偏向锁而言,重量级锁的实现更加复杂,性能开销也更高,因为它涉及到线程的阻塞和唤醒操作。