java synchronized和ReentrantLock的5个区别 - 面试宝典
【摘要】 Java中的synchronized和ReentrantLock都用于实现线程的同步,但它们之间有一些区别。使用方式:synchronized是Java的关键字,可以直接在方法或代码块中使用,而ReentrantLock是一个类,需要显式地创建和释放锁。可重入性:synchronized是可重入的,也就是说一个线程可以多次获得同一个锁,而ReentrantLock也是可重入的,但需要手动调用...
Java中的synchronized和ReentrantLock都用于实现线程的同步,但它们之间有一些区别。
- 使用方式:synchronized是Java的关键字,可以直接在方法或代码块中使用,而ReentrantLock是一个类,需要显式地创建和释放锁。
- 可重入性:synchronized是可重入的,也就是说一个线程可以多次获得同一个锁,而ReentrantLock也是可重入的,但需要手动调用lock()方法和unlock()方法。
- 公平性:synchronized是非公平锁,即线程的获取锁的顺序是不确定的,而ReentrantLock可以设置为公平锁或非公平锁,默认情况下是非公平锁。
- 性能:synchronized是Java语言级别的锁,由JVM负责实现,而ReentrantLock是基于Java的Lock接口实现的,可以通过选择不同的实现类来优化性能。
- 等待可中断: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)