ReetrantLock Synchronized Atomic的性能对比
2016-06-22 13:21
323 查看
之前看到了一篇帖子关于Lock和Synchronized的性能,写的是Lock比Synchronized的性能要好,可是,我试了下,结果却不是这样的。
之后看了这篇文章,http://www.cnblogs.com/Mainz/p/3546347.html,估计我是构建了一个比较特殊的高度争用的场景。
下面是我测试性能的代码:
运行结果如下:
Atomic:
43500000
2998
Lock:
43500000
1541
Synchronized:
43500000
529
之后看了这篇文章,http://www.cnblogs.com/Mainz/p/3546347.html,估计我是构建了一个比较特殊的高度争用的场景。
下面是我测试性能的代码:
package juc; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * 测试Lock Synchronized Atomic的性能 * Lock来改变变量,则必须用volatile修释,Atomic和Sychronized则保证了原子性和可见性 * 耗时:Synchronized < ReetrantLock < Atomic * 可能JDK 1.7之后对Synchronized做了比较大的优化,以至于效率最高 * @author jiujie * @version $Id: TestSpeed.java, v 0.1 2016年6月22日 上午10:24:42 jiujie Exp $ */ public class TestSpeed { private static final int LOOP_SIZE = 100000; private static final int MAX_THREAD_NUM = 30; public static class IntBox { private Lock lock = new ReentrantLock(); private int value; public IntBox(int value) { this.value = value; } public int getValue() { return value; } public synchronized void sychronizedIncrease() { value++; } public void lockIncrease() { lock.lock(); try { value++; } finally { lock.unlock(); } } } private static void executeThreads(Runnable runnable) throws InterruptedException { for (int threadNum = 0; threadNum < MAX_THREAD_NUM; threadNum++) { Thread[] threads = new Thread[threadNum]; for (int i = 0; i < threadNum; i++) { threads[i] = new Thread(runnable); } for (Thread thread : threads) { thread.start(); } for (Thread thread : threads) { thread.join(); } } } public static void main(String[] args) throws InterruptedException { final AtomicInteger v1 = new AtomicInteger(0); final IntBox v2 = new IntBox(0); final IntBox v3 = new IntBox(0); long now = System.currentTimeMillis(); executeThreads(new Runnable() { public void run() { testAtomicLock(v1); } }); System.out.println("Atomic:\n" + v1.get() + "\n" + (System.currentTimeMillis() - now)); now = System.currentTimeMillis(); executeThreads(new Runnable() { public void run() { testLock(v2); } }); System.out.println("Lock:\n" + v2.getValue() + "\n" + (System.currentTimeMillis() - now)); now = System.currentTimeMillis(); executeThreads(new Runnable() { public void run() { testSynchronize(v3); } }); System.out .println("Synchronized:\n" + v3.getValue() + "\n" + (System.currentTimeMillis() - now)); } public static void testSynchronize(final IntBox v) { for (int i = 0; i < LOOP_SIZE; i++) { v.sychronizedIncrease(); } } public static void testLock(final IntBox v) { for (int i = 0; i < LOOP_SIZE; i++) { v.lockIncrease(); } } public static void testAtomicLock(final AtomicInteger v) { for (int i = 0; i < LOOP_SIZE; i++) { v.getAndIncrement(); } } }
运行结果如下:
Atomic:
43500000
2998
Lock:
43500000
1541
Synchronized:
43500000
529
相关文章推荐
- Python3写爬虫(四)多线程实现数据爬取
- 选定虚拟主机 性能凸显优势
- 修改一行代码提升 Postgres 性能 100 倍
- C#实现多线程的同步方法实例分析
- redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
- 推荐Sql server一些常见性能问题的解决方法
- 浅谈chuck-lua中的多线程
- SQL Server误区30日谈 第9天 数据库文件收缩不会影响性能
- 和表值函数连接引发的性能问题分析
- SQLServer 2000 升级到 SQLServer 2008 性能之需要注意的地方之一
- C#简单多线程同步和优先权用法实例
- 数据库性能优化三:程序操作优化提升性能
- C#多线程学习之(四)使用线程池进行多线程的自动管理
- C#多线程编程中的锁系统(三)
- 解析C#多线程编程中异步多线程的实现及线程池的使用
- VBS中的字符串连接的性能问题
- C#多线程学习之(六)互斥对象用法实例
- 基于一个应用程序多线程误用的分析详解
- C#多线程学习之(三)生产者和消费者用法分析
- C#多线程学习之(一)多线程的相关概念分析