当涉及多线程并发访问共享资源时,Synchronized 关键字是 Java 中用于实现线程同步的关键工具。它可以应用于不同层次,包括类锁、方法锁以及重入锁。
1. Synchronized 关键字:
Synchronized 关键字可以用来创建临界区,保证在同一时间只有一个线程可以进入临界区执行代码,避免多线程环境下的数据竞争和不一致性问题。
2. 类锁:
**类锁:** 用 Synchronized 修饰静态方法或使用 Synchronized 块锁住 Class 类对象。
**作用范围:** 类锁作用于整个类的所有实例对象,即使有多个实例也只允许一个线程进入临界区。
3. 方法锁:
**方法锁:** 使用 Synchronized 修饰非静态方法。
**作用范围:** 方法锁作用于当前对象实例,在同一时间内只允许一个线程进入该实例对象的 Synchronized 方法。
4. 重入锁(Reentrant Lock):
**Reentrant Lock:** 是 Java 中提供的显式锁,通过 Lock 接口和实现类 ReentrantLock 来实现。
**特点:** 与 Synchronized 不同,Reentrant Lock 提供了更灵活的锁机制,支持公平性设置、可中断的锁获取、超时获取锁、尝试非阻塞获取锁等功能。
**重入性:** 与 Synchronized 一样,Reentrant Lock 也支持重入特性,同一个线程可以多次获取同一把锁,而不会死锁。
重要概念:
**可重入性(Reentrancy):** 指的是同一个线程在持有锁的情况下,能够重复获取该锁,而不会因为自己已经持有锁而被阻塞。Synchronized 和 Reentrant Lock 都支持可重入性。
**同步代码块:** 使用 Synchronized 关键字包围的代码片段,被一个线程执行时,其他线程不能同时执行这段代码。
**线程安全性:** 使用 Synchronized 或 Reentrant Lock 等机制来保证多线程环境下的数据一致性和正确性,避免因为并发访问导致的问题。
选择使用 Synchronized 还是 Reentrant Lock 取决于需求。Synchronized 更简单易用,而 Reentrant Lock 提供了更多的功能和灵活性。无论哪种方式,都能够确保多线程环境下的数据安全性。