ReetrantLock Synchronized Atomic的性能对比
之前看到了一篇帖子关于Lock和Synchronized的性能,写的是Lock比Synchronized的性能要好,可是,我试了下,结果却不是这样的,我所使用的JDK的版本是1.7,可能跟原帖作者用的JDK版本不一样,JDK对Synchronized做了优化。
下面是我测试性能的代码:
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
ReetrantLock Synchronized Atomic的性能对比的更多相关文章
- ReentrantLock和synchronized的性能对比
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo8 ReentrantLock和内部锁的性能对比 Reentran ...
- LongAdder和AtomicLong性能对比
jdk1.8中新原子操作封装类LongAdder和jdk1.5的AtomicLong和synchronized的性能对比,直接上代码: package com.itbac.cas; import ja ...
- iOS中保证线程安全的几种方式与性能对比
来源:景铭巴巴 链接:http://www.jianshu.com/p/938d68ed832c 一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized. ...
- 【多线程】:Synchronized和ReentrantLock的对比
相同点: 两者都是可重入锁,同一个线程每进入一次,锁的计数器都自增1,等到锁的计数器下降为0时才能释放锁. 底层实现对比: Synchronized是依赖于JVM实现的,而ReentrantLock是 ...
- Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比
## ArrayList线程安全问题 众所周知,`ArrayList`不是线程安全的,在并发场景使用`ArrayList`可能会导致add内容为null,迭代时并发修改list内容抛`Concurre ...
- java对象头信息和三种锁的性能对比
java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...
- 第41天学习打卡(死锁 Lock synchronized与Lock的对比 线程协作 使用线程池)
死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...
- [原] KVM 环境下MySQL性能对比
KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
随机推荐
- Qt for Mac:发布程序(widgets和quick2)
当你用Qt开发好程序后,是不是会很期待将你的成果分享给你的小伙伴 可是Qt的库并不是OS X标配的,所以我们要自己去复制库到app包里,才可以让app在其他未安装Qt的电脑上运行. 比较幸运的是,Qt ...
- Apache HTTP Server mod_dav.c 拒绝服务漏洞(CVE-2013-1896)
漏洞版本: Apache HTTP Server < 2.2.25 漏洞描述: CVE ID:CVE-2013-1896 Apache HTTP Server是一款流行的WEB服务器 Apach ...
- 【转】Android低功耗蓝牙应用开发获取的服务UUID
原文网址:http://blog.csdn.net/zhangjs0322/article/details/39048939 Android低功耗蓝牙应用程序开始时获取到的蓝牙血压计所有服务的UUID ...
- bzoj 1264 [AHOI2006]基因匹配Match(DP+树状数组)
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 793 Solved: 503[Submit][S ...
- C++使用模版技术将任意类型的数据转为某个类型的数据
将任意类型(int, float, 自定义的数据类型等等)的数据转换的某个类型C中储存,可以通过 将类型C的构造函数写成模版函数的形式,在C中将可以接收任意类型数据.如: class C{ templ ...
- qemu kvm 虚拟化
虚拟化: KVM是一个基于Linux内核的虚拟机,属于完全虚拟化.虚拟机监控的实现模型有两类:监控模型(Hypervisor)和宿主机模型(Host-based).由于监控模型需要进行处理器调度,还需 ...
- JSTL和select标签的组合使用
1.用于根据不同的值显示对应的内容,不能选择 <select name="grade"> <c:choose> <c:when test=" ...
- 从客户端(content="<span class="Apple-s...")中检测到有潜在危险的 Request.Form 值。
从客户端(content="<span class="Apple-s...")中检测到有潜在危险的 Request.Form 值. 说明: 请求验证过程检测到有潜在 ...
- CSU1661: Query Mutiple
Description One day,Little-Y saw many numbers standing in a row. A question suddenly appeared in her ...
- qt 关于内存泄漏的检测
Qt 关于内存泄露的检测: 收藏人:guitarhua 2012-02-10 | 阅: 转: | 来源 | 分享 Qt 关于内存泄露的检测:工具篇 ...