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

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。

猜你喜欢

转载自blog.csdn.net/q7w8e9r4/article/details/132533701