java synchronized和ReentrantLock的5个区别 - 面试宝典

举报
皮牙子抓饭 发表于 2023/08/04 09:21:54 2023/08/04
【摘要】 Java中的synchronized和ReentrantLock都用于实现线程的同步,但它们之间有一些区别。使用方式:synchronized是Java的关键字,可以直接在方法或代码块中使用,而ReentrantLock是一个类,需要显式地创建和释放锁。可重入性:synchronized是可重入的,也就是说一个线程可以多次获得同一个锁,而ReentrantLock也是可重入的,但需要手动调用...

Java中的synchronized和ReentrantLock都用于实现线程的同步,但它们之间有一些区别。

  1. 使用方式:synchronized是Java的关键字,可以直接在方法或代码块中使用,而ReentrantLock是一个类,需要显式地创建和释放锁。
  2. 可重入性:synchronized是可重入的,也就是说一个线程可以多次获得同一个锁,而ReentrantLock也是可重入的,但需要手动调用lock()方法和unlock()方法。
  3. 公平性:synchronized是非公平锁,即线程的获取锁的顺序是不确定的,而ReentrantLock可以设置为公平锁或非公平锁,默认情况下是非公平锁。
  4. 性能:synchronized是Java语言级别的锁,由JVM负责实现,而ReentrantLock是基于Java的Lock接口实现的,可以通过选择不同的实现类来优化性能。
  5. 等待可中断:ReentrantLock提供了一个可中断的锁获取方式,即tryLock()方法,可以尝试获取锁,如果获取不到,可以选择继续等待或者返回false。 下面是一个简单的示例代码,演示了synchronized和ReentrantLock的使用:
javaCopy codeimport java.util.concurrent.locks.ReentrantLock;
public class SynchronizedVsReentrantLock {
    private static int counter = 0;
    private static Object lock = new Object();
    private static ReentrantLock reentrantLock = new ReentrantLock();
    public static void synchronizedMethod() {
        synchronized (lock) {
            counter++;
        }
    }
    public static void reentrantLockMethod() {
        reentrantLock.lock();
        try {
            counter++;
        } finally {
            reentrantLock.unlock();
        }
    }
    public static void main(String[] args) throws InterruptedException {
        // 使用synchronized
        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                synchronizedMethod();
            }
        });
        // 使用ReentrantLock
        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                reentrantLockMethod();
            }
        });
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println("counter: " + counter);
    }
}

在上述代码中,counter是一个共享变量,synchronizedMethod()使用synchronized关键字同步代码块来保证对counter的操作的原子性,reentrantLockMethod()使用ReentrantLock来实现同样的功能。最后输出的counter的值应为2000。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。