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);
        }
    }
  • 相关阅读:
    移动端 line-height 不垂直居中问题
    CSS属性: 阴影 轮廓 渐变
    子div设置float后会导致父div无法自动撑开
    表格 滚动条 (tbody部分滚动)
    域控下发脚本,安装zabbix客户端
    cannot import name 'path' from django.urls
    添加私有yum库
    深夜感慨
    统计windows文件夹下文件大小(python脚本和powershell脚本)
    nginx日志切割
  • 原文地址:https://www.cnblogs.com/wdfwolf3/p/7373984.html
Copyright © 2011-2022 走看看