文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Synchronized 和 Lock 到底有什么区别

2024-11-30 01:05

关注

synchronized

synchronized 是Java中的一个关键字,用于控制对共享资源的并发访问,从而防止多个线程同时访问某个特定资源,这被称为同步。这个关键字可以用来修饰方法或代码块。

修饰方法

当synchronized修饰一个方法时,它表示整个方法体都是同步的,即同时只能有一个线程可以执行这个方法。

代码示例:

public synchronized void synchronizedMethod() {  
    // 方法体  
}

修饰代码块

synchronized也可以用来修饰一个代码块,这时需要指定一个锁对象。当一个线程进入synchronized代码块时,它需要获得这个锁对象的监视器锁,如果锁已经被其他线程持有,则该线程将被阻塞,直到锁被释放。

public void method() {  
    synchronized (this) {  
        // 代码块  
    }  
}

在这个例子中,this是锁对象。你也可以使用其他对象作为锁。

我们需要注意的几点内容:

我们总结一下:

synchronized 可以给类,方法,代码块加锁。

那么 Lock 呢?

LOCK

Java 的 Lock 接口及其实现类提供了一种比 synchronized 关键字更加灵活和可控制的锁机制。Lock 接口在 java.util.concurrent.locks 包中定义,它允许更细粒度的控制,包括尝试获取锁、定时获取锁以及可中断地获取锁等能力。

Lock 接口的主要方法

  1. lock(): 获取锁。如果锁被其他线程持有,则当前线程将被禁用,直到获取到锁。
  2. tryLock(): 尝试获取锁,如果成功则立即返回 true,如果锁被其他线程持有则返回 false。
  3. tryLock(long time, TimeUnit unit): 在指定的时间内尝试获取锁,如果成功则返回 true,如果在指定时间内没有获取到锁则返回 false。
  4. unlock(): 释放锁。
  5. newCondition(): 返回一个绑定到此 Lock 实例的 Condition 对象,用于等待/通知机制。

而这个 Lock 的主要实现类就是ReentrantLock。

也就是可重入锁,意味着一个线程可以多次获取同一个锁而不会发生死锁。它提供了与 synchronized 类似的功能,但提供了更多的灵活性。

我们看一段代码示例:

import java.util.concurrent.locks.Lock;  
import java.util.concurrent.locks.ReentrantLock;  
  
public class Counter {  
    private final Lock lock = new ReentrantLock();  
    private int count = 0;  
  
    public void increment() {  
        lock.lock();  // 获取锁  
        try {  
            count++;  
        } finally {  
            lock.unlock();  // 释放锁  
        }  
    }  
  
    public int getCount() {  
        return count;  
    }  
}

在这个例子中,Counter 类使用了一个 ReentrantLock 来确保 increment 方法的原子性。每次调用 increment 方法时,都会先获取锁,然后增加计数器,最后释放锁。

LOCK 和 synchronized 的比较

灵活性: Lock 提供了更灵活的锁获取方式,包括尝试获取和定时获取,而 synchronized 不支持这些功能。

等待可中断: Lock 的获取操作可以被中断,而 synchronized 的等待不能被中断。

锁分离: Lock 允许将等待/通知机制与锁分离,通过 Condition 对象来实现,而 synchronized 的等待/通知是与对象锁关联的。

性能: 在某些情况下,ReentrantLock 可能比 synchronized 提供更好的性能,特别是在高竞争的场景下,但这也取决于具体的使用情况。

语法简洁性: synchronized 的语法更简洁,适合简单的同步需求。

所以大家在选择使用 Lock 还是 synchronized 取决于具体的应用场景和需求。在需要更高级功能或更高性能的场景下,Lock 可能是更好的选择。在简单的同步需求下,synchronized 通常更易于使用和理解。

但是他们的底层区别在哪呢?

lock 和 synchronized 底层原理区别

Synchronized是Java语言内置的关键字,它的实现是基于JVM的,源码在JVM中,用C++语言实现。其锁机制是基于对象头的Mark Word来实现的,包括偏向锁、轻量级锁和重量级锁。当线程尝试进入synchronized代码块或方法时,JVM会根据当前对象的锁状态以及线程的锁请求来进行相应的处理。

Lock是一个接口,它的实现类如ReentrantLock是由JDK提供的,用Java语言实现。Lock的实现是基于Java代码的,它通过内部的AbstractQueuedSynchronizer(AQS)框架来实现锁的获取、释放以及线程等待和唤醒等功能。AQS框架是JDK中提供的一个用于构建锁和同步器的框架,它维护了一个FIFO的队列来管理等待获取锁的线程。

对于他们的区别,你理解了多少呢?

来源:Java极客技术内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯