之前看到了一篇帖子关于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的性能对比的更多相关文章

  1. ReentrantLock和synchronized的性能对比

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo8 ReentrantLock和内部锁的性能对比     Reentran ...

  2. LongAdder和AtomicLong性能对比

    jdk1.8中新原子操作封装类LongAdder和jdk1.5的AtomicLong和synchronized的性能对比,直接上代码: package com.itbac.cas; import ja ...

  3. iOS中保证线程安全的几种方式与性能对比

    来源:景铭巴巴 链接:http://www.jianshu.com/p/938d68ed832c 一.前言 前段时间看了几个开源项目,发现他们保持线程同步的方式各不相同,有@synchronized. ...

  4. 【多线程】:Synchronized和ReentrantLock的对比

    相同点: 两者都是可重入锁,同一个线程每进入一次,锁的计数器都自增1,等到锁的计数器下降为0时才能释放锁. 底层实现对比: Synchronized是依赖于JVM实现的,而ReentrantLock是 ...

  5. Collections.synchronizedList 、CopyOnWriteArrayList、Vector介绍、源码浅析与性能对比

    ## ArrayList线程安全问题 众所周知,`ArrayList`不是线程安全的,在并发场景使用`ArrayList`可能会导致add内容为null,迭代时并发修改list内容抛`Concurre ...

  6. java对象头信息和三种锁的性能对比

    java头的信息分析 首先为什么我要去研究java的对象头呢? 这里截取一张hotspot的源码当中的注释 这张图换成可读的表格如下 |-------------------------------- ...

  7. 第41天学习打卡(死锁 Lock synchronized与Lock的对比 线程协作 使用线程池)

    死锁 多个线程各自占有一些共享资源,并且互相等待其他线程占有的资源才能运行,而导致两个或者多个线程都在等待对方释放资源,都停止执行的情形.某一个同步块同时拥有"两个以上对象的锁"时 ...

  8. [原] KVM 环境下MySQL性能对比

    KVM 环境下MySQL性能对比 标签(空格分隔): Cloud2.0 [TOC] 测试目的 对比MySQL在物理机和KVM环境下性能情况 压测标准 压测遵循单一变量原则,所有的对比都是只改变一个变量 ...

  9. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

随机推荐

  1. delphi编程里的bool跟boolean类型有什么区别

    bool是LongBool类型. Delphi中定义了四种布尔类型:Boolean,ByteBool,WordBool和LongBool.后面三种布尔类型是为了与其他语言兼容而引入的,一般情况下建议使 ...

  2. Struts2+JFreeChart

    前言 关于Struts2入门以及提高等在这里就不介绍了,但是关于Struts2的学习有以下推荐: struts2-showcase-2.0.6.war:这个是官方自带的Demo(struts-2.0. ...

  3. 【HDOJ】2579 Dating with girls(2)

    简单BFS. /* 2579 */ #include <iostream> #include <queue> #include <cstdio> #include ...

  4. 【转】android ListView详解---- 不错不错

    原文网址:http://www.cnblogs.com/allin/archive/2010/05/11/1732200.html 由于google doc 很多人都打不开,故更新了源码下载地址 [源 ...

  5. 【图论】Codeforces 711D Directed Roads

    题目链接: http://codeforces.com/problemset/problem/711/D 题目大意: 给一张N个点N条有向边的图,边可以逆向.问任意逆向若干条边使得这张图无环的方案数( ...

  6. 201512读书分享——读《做自己的No.1》“哪一天”是永远不会到来的

    在看这本书的同时,最近也看了一部电影叫做<令人怦然心动的人生整理魔法>,讲一个女孩子平常不善收理,然后房间和人生乱七八糟,她总想着“等哪一天有空了就收拾”.但是,最终一句话打醒了——“哪一 ...

  7. zookeeper集群环境安装配置

    众所周知,Zookeeper有三种不同的运行环境,包括:单机环境.集群环境和集群伪分布式环境 在此介绍的是集群环境的安装配置 一.下载: http://apache.fayea.com/zookeep ...

  8. Listview加载更多是,恢复到原来的位置,如果不加特殊处理,总是跳转第一条

    1.记录listView滚动到的位置的坐标,然后利用listView.scrollTo精确的进行恢复 listView.setOnScrollListener(new OnScrollListener ...

  9. HDU 2222 AC自动机 裸题

    题意: 问母串中出现多少个模式串 注意ac自动机的节点总数 #include <stdio.h> #include <string.h> #include <queue& ...

  10. 纠结的CLI C++与Native C++的交互

    最近在写点东西,涉及到了CLR C++与Native C++的互相调用的问题,结果...........纠结啊. 交互原型 交互原型是这样的: void* avio_alloc_context( un ...