`
阅读更多
Here is a simple benchmark case for testing the performance between ReentrantLock and Synchronized.


Machine: 2 phycial processors with hyperthreading enabled (4 logical processors)

OS: windows server 2003

JVM version: 1.6

Threads Number: 4

Benchmark result:
Synchronized - 25786ms
ReentrantLock - 10656ms

This shows ReentrantLock has much better performance than synchronized  keyword. However, some people said there should be no different between ReentrantLock and Synchronized keyword in 1.6. Any wrong?


Test Case(note: you can also use of semaphore to setup barrier for all threads):
import java.util.HashMap;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Lock;

public class HighContentionSimulator implements Runnable {

	private static HashMap map = new HashMap();
	
	public static int LOCK = 0;
	public static int SYNC = 1;
	
	private Lock lock = new ReentrantLock();

	private int mode = 0;
	
	private int count = 100;
	
	private char[] charTable = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k'};
	
	public HighContentionSimulator()
	{
		
	}
	
	public HighContentionSimulator(int mode, int count)
	{
		this.mode = mode;
		this.count = count;
	}
	
	
	public void run()
	{
		try
		{
			while (count > 0)
			{
				if (mode == LOCK)
				{
					runLock();
				}
				else if (mode == SYNC)
				{
					runSync();
				}
				else
				{
					throw new Exception("invalid mode!");
				}
				count--;
			}
			
		}
		catch(Exception e)
		{
			e.printStackTrace();
		}
		
		
	}
	
	public synchronized void runSync()
	{
		System.out.print("synchronized mode");
		operation();
	}
	
	public void runLock()
	{
		System.out.print("lock mode");
		lock.lock();
		try
		{
			operation();
		}
		finally
		{
			lock.unlock();
		}
	}
	
	public void operation()
	{
		int seed = 10000;
		int key = (int)Math.random()* seed;
		int countValue = (int)Math.random() * charTable.length;
		StringBuffer sb = new StringBuffer();
		for (int i=0; i<countValue; i++)
		{
			sb.append(charTable[(int)Math.random() * charTable.length]);
		}
		Object o = map.get(key);
		String value = sb.toString();
		if (o != null)
		{
			if (value.equalsIgnoreCase((String)o))
			{
				return;
			}
		}
		map.put(key, value);
	}
	
	public static void main(String[] args)
	{
		int threadNumber = 4;
		int count = 99999;
		long start = System.currentTimeMillis();
		Thread[] threads = new Thread[4];
		for (int i=0; i<threadNumber; i++)
		{
			threads[i] = new Thread(new HighContentionSimulator(HighContentionSimulator.LOCK, count));
			threads[i].start();
		}

		for (int i=0; i<threadNumber; i++)
		{
			try
			{
				threads[i].join();
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
		System.out.println("time cost: " + (System.currentTimeMillis() - start));
		
	}
}



分享到:
评论

相关推荐

    ReentrantLock与synchronized区别

    java语言 并发编程 ReentrantLock与synchronized区别 详解

    ReentrantLock与synchronized

    在Java多线程编程中,`ReentrantLock`和`synchronized`都是用于实现线程同步的重要工具,确保在并发环境中数据的一致性和正确性。两者虽然都能实现互斥访问,但在功能、性能以及使用场景上有所不同。下面我们将深入...

    ReentrantLock 与 synchronized 简介

    ### ReentrantLock 与 synchronized 的比较 #### 一、引言 在Java中,多线程和并发控制一直是程序员关注的重点。随着Java的发展,其语言本身及标准库提供了丰富的工具来帮助开发者处理并发问题。其中,`...

    深入java并发编程,使用ReentrantLock和 Synchronized加锁

    在Java并发编程中,理解和熟练使用同步机制是至关重要的,这包括了`ReentrantLock`和`synchronized`关键字。这两个工具都是为了确保多线程环境中的数据一致性与安全性,防止出现竞态条件和死锁等问题。 `...

    第15讲 synchronized和ReentrantLock有什么区别呢?1

    在Java编程中,synchronized和ReentrantLock都是用于实现线程同步的重要工具,它们在并发控制方面扮演着关键角色。然而,两者之间存在一些显著的区别,这些差异体现在功能、灵活性、性能以及使用场景上。 首先,...

    简单聊聊Synchronized和ReentrantLock锁.docx

    本文将深入探讨Synchronized关键字锁和ReentrantLock锁的异同、功能特性以及它们在实际应用中的适用场景。 首先,Synchronized是一种内置的Java关键字,它提供了简单而强大的线程同步机制。当一个线程进入一个由...

    synchronized ReentrantLock volatile Atomic 原理分析.docx

    《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...

    Java中ReentrantLock的使用.docx

    Java中的ReentrantLock是线程安全编程中的一种高级锁机制,它属于Lock接口的一个实现,提供了比synchronized更丰富的功能和更高的灵活性。ReentrantLock的名字来源于它的可重入性,这意味着一个线程可以多次获取同一...

    Lock、Synchoronized和ReentrantLock的使用

    Lock、Synchronized 和 ReentrantLock 的使用 Lock、Synchronized 和 ReentrantLock 是 Java 中三种常用的同步机制,每种机制都有其特点和使用场景。下面对这三种机制进行详细的分析和比较。 一、Synchronized ...

    22 到底哪把锁更适合你?—synchronized与ReentrantLock对比.pdf

    在Java中,有两种主要的锁机制:内置的`synchronized`关键字和显式的`ReentrantLock`类。这两者各有优劣,适用于不同的场景。下面我们将详细讨论它们的区别、性能、特性以及使用上的差异。 1. **功能对比**: - `...

    java ReentrantLock详解.docx

    `ReentrantLock`是Java并发编程中的一种高级锁机制,它是`java.util.concurrent.locks`包中的类,提供了比`synchronized`关键字更丰富的功能和更细粒度的控制。相较于`synchronized`,`ReentrantLock`的主要优势在于...

    Java中的ReentrantLock类最全讲义

    目录: 简介 ReentrantLock的基本用法 2.1 创建ReentrantLock 2.2 获取锁和释放锁 公平性与非公平性 3.1 公平锁 3.2 非公平锁 中断响应 ...ReentrantLock与synchronized的对比 最佳实践与注意事项

    并发编程 70 道面试题及答案.docx

    2. ReentrantLock 和 synchronized 的使用场景分别是什么? 答案:ReentrantLock 通常用于需要灵活锁定的场景,而 synchronized 通常用于实现线程安全。 五、volatile 关键字的作用 1. volatile 关键字的作用是...

    带你看看Java的锁(一)-ReentrantLock

    带你看看Javad的锁-ReentrantLock前言ReentrantLock简介Synchronized对比用法源码分析代码结构方法分析SyncNonfairSyncFairSync非公平锁VS公平锁什么是公平非公平ReentrantLockReentrantLock的构造函数lock加锁方法...

    第15讲丨synchronized和ReentrantLock有什么区别呢?.html

    第15讲丨synchronized和ReentrantLock有什么区别呢?.html

    synchronized关键字的实质及用法

    Java 5引入了`java.util.concurrent.locks.ReentrantLock`,它提供了与`synchronized`相似的功能,但具有更多高级特性,如可中断的等待、公平锁等。在某些情况下,ReentrantLock可能比`synchronized`更适合。 8. *...

    ReentrantLock解析

    与synchronized关键字相比,ReentrantLock提供了更高的灵活性,如尝试加锁、定时加锁和公平锁等功能。本文将深入探讨ReentrantLock的实现原理,主要涉及其内部类AbstractQueuedSynchronizer(AQS)和Unsafe工具类。 ...

Global site tag (gtag.js) - Google Analytics