LOCK 与Syschronized 差异

Java锁机制详解

1.从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。synchronized是java中的一个关键字,也就是说是Java语言内置的特性。

2.synchronized对象在获取锁后,其他线程只能等待,无法同时进行读操作,影响程序执行效率。lock锁住对象时,当一个线程在进行读操作时,其他线程可以进行读操作。

3.synchronized不需要用户去手动释放锁,执行完后系统会自动让线程释放对锁的占用。Lock则必须要用户去手动释放锁,如果没有主动释放锁,就有可能导致出现死锁现象。

4.synchronized无法判断状态,lock可以判断状态

5.synchronized是非公平锁,lock可以自动选择是否公平锁。

6.synchronized适合少量代码,lock适合大量同步代码。

Java 语言中,`synchronized` `Lock` 都是用于实现线程同步的机制,但它们存在多方面的差异: ### 语法结构 - **`synchronized`**:是 Java 内置的关键字,使用较为简单,可修饰方法或代码块。修饰方法时,整个方法体都会被同步;修饰代码块时,需要指定同步的对象。示例如下: ```java public class SynchronizedExample { // 同步方法 public synchronized void syncMethod() { // 同步代码 } public void syncBlock() { Object lock = new Object(); // 同步代码块 synchronized (lock) { // 同步代码 } } } ``` - **`Lock`**:是一个接口,需要通过其实现类(如 `ReentrantLock`)来使用,并且需要手动加锁解锁。示例如下: ```java import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class LockExample { private final Lock lock = new ReentrantLock(); public void lockMethod() { lock.lock(); try { // 同步代码 } finally { lock.unlock(); } } } ``` ### 功能特性 - **`synchronized`**:功能相对有限,不支持中断等待锁的线程,也不支持超时获取锁,并且只有一个条件(即锁本身)来控制线程的等待唤醒。 - **`Lock`**:提供了更丰富的功能,支持可中断锁(`lockInterruptibly()` 方法)、超时获取锁(`tryLock(long time, TimeUnit unit)` 方法),还可以创建多个 `Condition` 对象来实现更精细的线程控制[^1]。 ### 性能表现 在 JDK 1.5 之前,`Lock` 的性能明显优于 `synchronized`。但在 JDK 1.6 版本对 `synchronized` 进行优化之后,两者的性能差异不大。在大多数情况下,`synchronized` 已经足够,只有在需要其不具备的高级功能时,才应考虑使用 `Lock` [^1][^2]。 ### 锁的公平性 - **`synchronized`**:是非公平锁,即线程获取锁的顺序是不确定的,可能会导致某些线程长时间得不到锁。 - **`Lock`**:可以选择公平锁或非公平锁,例如 `ReentrantLock` 可以在构造函数中指定是否为公平锁。公平锁会按照线程请求锁的顺序来分配锁,保证线程获取锁的公平性。 ### 使用场景 - **`synchronized`**:适用于大多数简单的同步场景,使用简单,能满足基本的线程同步需求。 - **`Lock`**:适用于需要高级功能(如可中断锁、超时获取锁、公平锁、多条件控制)的复杂同步场景。JDK 的 `StampedLock` `ReadWriteLock` 提供了更细粒度的锁控制,也属于 `Lock` 体系,适用于特定场景[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值