zoukankan      html  css  js  c++  java
  • synchronized 和 Reentrantlock简单例子对比

      个人博客地址:http://www.cnblogs.com/wdfwolf3/。转载注明出处,谢谢。

      两个锁的对比就不再赘述,直接上代码。两次实验,第一次是固定5个线程,调整每个线程的循环次数,得到的运行时间。第二次是每个线程的循环次数固定10000000,调整线程数,得到的运行时间。

    /**
     * 5个线程,每个循环次数          100000  1000000  10000000  100000000
     * synchronized(ms)              29      265      3293     47789
     * ReentrantLock(ms)             79      165      1473     14923
     * volatile(ms)                  count++非原子操作不能同步
     * 
     * 10000000次 线程数       2     5     8    15
     * synchronized(ms)     661   3293  7084  11380
     * ReentrantLock(ms)    767   1473  2342  3672
     */
    public class SynchronizedTest {
        public static void main(String[] args) {
            //线程数
            int threadNum = 5;
            Syn syn = new Syn();
            Thread[] threads = new Thread[threadNum];
            //记录运行时间
            long l = System.currentTimeMillis();
            for (int i = 0; i < threadNum; i++) {
                threads[i] = new Thread(new Runnable() {
                    @Override
                    public void run() {
                        for (int j = 0; j < 10000000; j++) {
                            syn.increaseLock();
                        }
                    }
                });
                threads[i].start();
            }
            //等待所有线程结束
            try {
                for (int i = 0; i < threadNum; i++)
                    threads[i].join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(syn + " : " + (System.currentTimeMillis() - l) + "ms");
        }
    }
    
    class Syn {
        private int count = 0;
        private Lock lock = new ReentrantLock();
    
        //利用synchronized
        public void increase() {
            synchronized (this) {
                count++;
            }
        }
    
        //利用ReentrantLock类同步
        public void increaseLock() {
            lock.lock();
    //        if (count == 5000000)
    //            System.out.println(lock);
            count++;
            lock.unlock();
        }
    
        public void increaseVolatile() {
            count = count + 1;
        }
    
        @Override
        public String toString() {
            return String.valueOf(count);
        }
    }
  • 相关阅读:
    Java基本语法--程序流程控制
    Java基本语法--控制台输入(Scanner类)
    Java基本语法--运算符
    curl:出现SSL错误提示
    升级ruby的版本
    Linux之expect非交互式功能
    Rsync备份同步数据工具
    Linux发展历史
    解决DDOS攻击生产案例
    用shell脚本监控MySQL主从同步
  • 原文地址:https://www.cnblogs.com/wdfwolf3/p/7373984.html
Copyright © 2011-2022 走看看