【java面试100问】89 lock和synchronized的区别?

文摘   2025-01-23 07:54   天津  

 

一、基本概念

  1. 1. synchronized:这是Java中的一个关键字,用来实现线程间的同步。

它可以在方法级别或者代码块级别上使用,确保同一时刻只有一个线程可以执行被synchronized修饰的方法或代码块。

  1. 2. Lock:这是Java中的一个接口,提供了更灵活和强大的锁机制。

Lock接口的实现类(如ReentrantLock)提供了多种加锁和解锁的方式,以及更丰富的功能。

二、主要区别

  1. 1. 实现方式
  • • synchronized是Java语言内置的关键字,由JVM实现。
  • • Lock是一个接口,需要手动获取和释放锁。
  • 2. 锁的释放
    • • synchronized会自动释放锁。

    当线程执行完synchronized修饰的方法或代码块后,锁会自动释放。

    • • Lock需要手动释放锁。

    如果忘记释放锁,可能会导致死锁。因此,通常需要在finally块中释放锁。

    1. 3. 锁的获取
    • • synchronized在获取锁时,如果锁不可用,线程会被阻塞,直到锁被释放。
    • • Lock提供了更多的获取锁的方式,比如可中断地获取锁(lockInterruptibly)、尝试非阻塞地获取锁(tryLock)等。
  • 4. 锁的公平性
    • • synchronized不保证线程获取锁的公平性。
    • • Lock可以通过构造函数指定使用公平锁或非公平锁。

    公平锁会按照申请锁的顺序来获取锁。

    1. 5. 锁的灵活性
    • • synchronized的使用比较简单,但缺乏灵活性。
    • • Lock提供了更灵活和强大的锁机制,比如可以创建多个条件变量(Condition),实现更复杂的线程间通信。

    三、示例代码

    synchronized示例

    public class CounterSync {
        private int count = 0;

        public synchronized void increment() {
            count++;
        }
    }

    Lock示例

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

    publicclassCounterLock {
        privatefinalLocklock=newReentrantLock();
        privateintcount=0;

        publicvoidincrement() {
            lock.lock();
            try {
                count++;
            } finally {
                lock.unlock();
            }
        }
    }

    四、总结

    • • 使用场景:对于简单的同步需求,推荐使用synchronized,因为它简洁且易于使用。

    对于需要更高灵活性和精确控制的复杂同步场景,可以考虑使用Lock。

    • • 性能:在JDK 1.6及以后的版本中,synchronized通过锁优化技术(如锁粗化、锁消除、轻量级锁和偏向锁)提高了性能。

    但在某些复杂场景下,Lock可能仍然提供更好的性能。

    通过上面的讲解和示例,相信你已经对locksynchronized的区别有了更清晰的认识。

    在实际开发中,可以根据具体需求选择合适的同步机制,以确保线程安全和程序的正确性。

     


    希望文章能给大家带来点技术收获。也希望大家能够点赞收藏转发,让知识成为大家的财富。你的支持,是我最大的动力!

      

    你诺喜欢,请点个关注

    大家可以发送消息:202501

    领取计算机黑皮书191本(1月有效)


    推荐文章:

    推荐java面试100题讲解源文件

    推荐Spring Cloud Alibaba笔记

    夏壹分享
    系统化技术讲解,每日精进,为后端技术人员打造的知识充电站!
     最新文章