Synchronized 关键字的底层原理
时间: 2025-01-18 12:08:48 浏览: 32
Synchronized关键字在Java中用于实现线程同步,其底层原理主要涉及 monitors(监视器)和互斥锁[^1]。当一个线程访问到synchronized修饰的方法或代码块时,它会尝试获取该对象的监视器。如果监视器当前未被其他线程持有,则线程获得监视器并继续执行;否则,线程会被阻塞,直到监视器释放。
`synchronized`与`lock`的主要区别在于:
1. 锁粒度:`synchronized`通常针对整个对象(Object实例),这意味着锁定的是对象,而不仅仅是代码块。`Lock`接口则提供了更细粒度的控制,允许对特定代码块进行锁定。
2. 易于管理:`Lock`提供了更多的灵活性,可以设置超时、公平/非公平策略以及可中断锁,而在Java的标准库中,这些特性不是`synchronized`的一部分。
3. 异常传播:在`try-finally`结构中,如果在`try`块中抛出了异常,`finally`块的资源清理不会因为异常而被跳过,这在`synchronized`中也适用。但在`Lock`上,异常可能不一定会导致锁立即释放。
示例演示(简化版):
```java
// 使用synchronized
public class SynchronizedExample {
private Object lock = new Object();
public void method() synchronized {
// 访问共享资源...
}
}
// 使用Lock
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockExample {
private final Lock lock = new ReentrantLock();
public void method() {
lock.lock();
try {
// 访问共享资源...
} finally {
lock.unlock();
}
}
}
```
阅读全文
相关推荐



















