synchronized和Lock的区别

2023-09-06 15:36:31 浏览数 (1)

前言

最近了不起在面试,经常被问到关于synchronized和Lock的相关知识点。所以整理了一些相关资料,供大家一起学习。

synchronized

特性

synchronized是Java的关键字,是基于JVM底层的Monitor锁实现的,用于修饰方法或代码块。在JDK1.6之前,synchronized的锁性能较低,但是在JDK1.6开始,JDK对synchronized锁进行了大量的优化,同时引入了无锁、偏向锁、轻量级锁、重量级锁、锁消除、锁粗化等技术来提升synchronized锁的性能。

使用方法

synchronized有两种使用方法

  1. 锁代码块
  2. 锁方法
代码语言:javascript复制
public class SynchronizedExample {
    public static void main(String[] args) {

        SynchronizedExample synchronizedExample = new SynchronizedExample();

        // 1.锁代码块
        synchronizedExample.syncCodeBlock();

        // 2.锁方法
        synchronizedExample.syncMethod();
    }

    private void syncCodeBlock() {
        synchronized (this) {
            System.out.println("sync code block");
        }
    }

    private synchronized void  syncMethod() {
        System.out.println("sync method");
    }
}

Lock

特性

Lock是Java并发包JUC下的接口,其有很多实现类,较为常用的是ReentrantLock,默认使用非公平锁。Lock需要进行手动加锁(lock)和解锁(unlock)。同时,Lock还有更强大的功能,如它的tryLock()方法可以非阻塞的去获取锁、使用Condition实现等待通知效果。

使用方法

代码语言:javascript复制
public class LockExample {
    public static void main(String[] args) {

        Lock lock = new ReentrantLock();

        lock.lock();
        try {
            System.out.println("lock...");
        }finally {
            lock.unlock();
        }

    }
}

对比

特征

synchronized

Lock

锁类型

内置锁

显式锁

使用方式

关键字

对象实例化

可重入

可中断

公平性

不保证

可手动设置为公平或非公平

锁的数量

单一

可以创建多个

锁的灵活性

限制较多,无法扩展或自定义功能

提供更多灵活性,可以自定义功能

异常处理

由JVM自动处理

需要手动处理

总结

synchronized是一种简单且易于使用的锁机制,适合简单的线程同步需求。而Lock接口提供了更多的功能和灵活性,适用于复杂的同步场景。所以,选择哪一种锁需要基于具体的需求和设计。

0 人点赞