import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class HighContentionSimulator implements Runnable {
enum Mode implements Runnable {
LOCK {
private final Lock lock = new ReentrantLock();
public void run() {
lock.lock();
try {
operation();
} finally {
lock.unlock();
}
}},
SYNC {
public synchronized void run() {
operation();
}}
}
private final Mode mode;
private final int count;
public HighContentionSimulator(Mode mode, int count) {
this.mode = mode;
this.count = count;
}
public void run() {
for (int i = 0; i < count; i++)
mode.run();
}
public static void operation() {
Double d = Math.random();
}
private static void test(Mode mode) throws InterruptedException {
int threadNumber = 4;
int count = 1000 * 1000;
long start = System.nanoTime();
Thread[] threads = new Thread[threadNumber];
for (int i = 0; i < threadNumber; i++)
(threads[i] = new Thread(new HighContentionSimulator(mode, count))).start();
for (int i = 0; i < threadNumber; i++)
threads[i].join();
long rate = 1000L * 1000 * 1000 * count * threadNumber / (System.nanoTime() - start);
System.out.printf("%s operations/second %,d%n", mode.toString(), rate);
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < 3; i++) {
test(Mode.LOCK);
test(Mode.SYNC);
}
}
}
Prints
LOCK operations/second 2,722,306
SYNC operations/second 967,460
LOCK operations/second 2,838,865
SYNC operations/second 972,421
LOCK operations/second 2,848,031
SYNC operations/second 1,094,899
分享到:
相关推荐
java语言 并发编程 ReentrantLock与synchronized区别 详解
在Java多线程编程中,`ReentrantLock`和`synchronized`都是用于实现线程同步的重要工具,确保在并发环境中数据的一致性和正确性。两者虽然都能实现互斥访问,但在功能、性能以及使用场景上有所不同。下面我们将深入...
### ReentrantLock 与 synchronized 的比较 #### 一、引言 在Java中,多线程和并发控制一直是程序员关注的重点。随着Java的发展,其语言本身及标准库提供了丰富的工具来帮助开发者处理并发问题。其中,`...
在Java并发编程中,理解和熟练使用同步机制是至关重要的,这包括了`ReentrantLock`和`synchronized`关键字。这两个工具都是为了确保多线程环境中的数据一致性与安全性,防止出现竞态条件和死锁等问题。 `...
在Java编程中,synchronized和ReentrantLock都是用于实现线程同步的重要工具,它们在并发控制方面扮演着关键角色。然而,两者之间存在一些显著的区别,这些差异体现在功能、灵活性、性能以及使用场景上。 首先,...
本文将深入探讨Synchronized关键字锁和ReentrantLock锁的异同、功能特性以及它们在实际应用中的适用场景。 首先,Synchronized是一种内置的Java关键字,它提供了简单而强大的线程同步机制。当一个线程进入一个由...
《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...
Java中的ReentrantLock是线程安全编程中的一种高级锁机制,它属于Lock接口的一个实现,提供了比synchronized更丰富的功能和更高的灵活性。ReentrantLock的名字来源于它的可重入性,这意味着一个线程可以多次获取同一...
Lock、Synchronized 和 ReentrantLock 的使用 Lock、Synchronized 和 ReentrantLock 是 Java 中三种常用的同步机制,每种机制都有其特点和使用场景。下面对这三种机制进行详细的分析和比较。 一、Synchronized ...
目录: 简介 ReentrantLock的基本用法 2.1 创建ReentrantLock 2.2 获取锁和释放锁 公平性与非公平性 3.1 公平锁 3.2 非公平锁 中断响应 ...ReentrantLock与synchronized的对比 最佳实践与注意事项
在Java中,有两种主要的锁机制:内置的`synchronized`关键字和显式的`ReentrantLock`类。这两者各有优劣,适用于不同的场景。下面我们将详细讨论它们的区别、性能、特性以及使用上的差异。 1. **功能对比**: - `...
`ReentrantLock`是Java并发编程中的一种高级锁机制,它是`java.util.concurrent.locks`包中的类,提供了比`synchronized`关键字更丰富的功能和更细粒度的控制。相较于`synchronized`,`ReentrantLock`的主要优势在于...
ReentrantLock的锁机制是通过CAS(Compare-And-Swap)操作来实现的。CAS操作是原子操作,用于更新对象内的一个变量。ReentrantLock的lock方法使用CAS操作来尝试更新对象内的一个变量,如果更新成功,则将...
2. ReentrantLock 和 synchronized 的使用场景分别是什么? 答案:ReentrantLock 通常用于需要灵活锁定的场景,而 synchronized 通常用于实现线程安全。 五、volatile 关键字的作用 1. volatile 关键字的作用是...
带你看看Javad的锁-ReentrantLock前言ReentrantLock简介Synchronized对比用法源码分析代码结构方法分析SyncNonfairSyncFairSync非公平锁VS公平锁什么是公平非公平ReentrantLockReentrantLock的构造函数lock加锁方法...
第15讲丨synchronized和ReentrantLock有什么区别呢?.html
与synchronized关键字相比,ReentrantLock提供了更高的灵活性,如尝试加锁、定时加锁和公平锁等功能。本文将深入探讨ReentrantLock的实现原理,主要涉及其内部类AbstractQueuedSynchronizer(AQS)和Unsafe工具类。 ...