在 Java 中,锁有多种实现方式,主要包括以下几种:
一、synchronized 关键字
1. 作用于方法
同步实例方法:通过在实例方法上使用synchronized关键字,锁对象是当前实例对象(this)。确保在同一时刻,只有一个线程可以执行该实例方法。
同步静态方法:在静态方法上使用synchronized关键字时,锁对象是当前类的 Class 对象。这意味着不同的线程在访问该静态方法时需要获取该类的 Class 对象锁。
2. 作用于代码块
可以指定一个对象作为锁,多个线程在访问被synchronized修饰的代码块时,需要获取指定的对象锁才能进入代码块执行代码。
synchronized是一种内置的语言级别的锁机制,使用简单方便,但在一些高并发场景下可能性能不是最优。
二、Lock 接口
Java 中的java.util.concurrent.locks.Lock接口提供了比synchronized更灵活和强大的锁机制。常见的实现类有`ReentrantLock`。
1. 可中断的获取锁
ReentrantLock支持在获取锁的过程中被中断。如果一个线程在等待获取锁时被中断,它可以响应中断并停止等待锁。
2. 尝试获取锁
tryLock()方法可以尝试非阻塞地获取锁。如果锁可用,立即返回 true 并获取锁;如果锁不可用,立即返回 false,不会阻塞线程等待锁。
3. 支持公平锁
可以在构造ReentrantLock时传入参数true来创建公平锁。公平锁会按照线程请求锁的顺序来分配锁,保证等待时间最长的线程优先获得锁。
三、读写锁(ReadWriteLock 接口)
java.util.concurrent.locks.ReadWriteLock接口定义了读写锁的规范,实现类为ReentrantReadWriteLock。
1. 读锁和写锁分离
允许多个线程同时获取读锁,只要没有线程持有写锁。读锁的获取不会阻塞其他线程获取读锁,但会阻塞写锁的获取。
写锁是排他的,只有一个线程可以获取写锁,并且在获取写锁时会阻塞其他线程的读锁和写锁请求。
2. 适用于读多写少的场景
在读取操作远远多于写入操作的情况下,可以提高并发性能。
四、原子类(如AtomicInteger等)
Java 中的原子类位于java.util.concurrent.atomic包下,它们通过使用底层的硬件支持(如处理器的原子指令)来实现对变量的原子操作,不需要显式地使用锁。
例如,AtomicInteger可以原子地更新整数值,避免了在多线程环境下使用普通的整数变量可能出现的线程安全问题。
综上所述,Java 提供了多种锁的实现方式,可以根据不同的应用场景选择合适的锁机制来确保线程安全。
标签:写锁,Java,synchronized,实现,获取,读锁,线程 From: https://blog.csdn.net/chinansa/article/details/142302364