java多线程ReentrantLock、sync、ReentrantReadWriteLock性能比较 绝地灬酷狼 2022-08-23 00:58 133阅读 0赞 原文:[java多线程ReentrantLock、sync、ReentrantReadWriteLock性能比较][java_ReentrantLock_sync_ReentrantReadWriteLock] 源代码下载地址:[http://www.zuidaima.com/share/1796775925894144.htm][java_ReentrantLock_sync_ReentrantReadWriteLock] 今天在了解ReentrantReadWriteLock的时候,看到了一篇文章,模拟了ReentrantLock、synchronized、ReentrantReadWriteLock三种锁在不同场景下的性能情况,对了解这三种锁在不同场景下的性能会有一定帮助。 代码: import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.ReentrantReadWriteLock; public class CurrentObject { private static Random random = new Random(); public final static int READ_NUM = 180;// 读线程数 public final static int WRITE_NUM = 20;// 写线程数 private int value;//并发需要读写的值 private ReadWriteLock lock = new ReentrantReadWriteLock(); private Lock locknew = new ReentrantLock(); /** * 用于读/写平均耗时的展现 */ public static void display() { System.out.println("读平均耗时:" + (TimeCostUtils.getReadLong().get() / READ_NUM) + " ns"); System.out.println("写平均耗时:" + (TimeCostUtils.getWriteLong().get() / WRITE_NUM) + " ns"); } /** * 通过ReentrantReadWriteLock添加读锁 * @return value * {@link ReentrantReadWriteLock} */ public int getValueLock() { lock.readLock().lock(); try { return value; } finally { lock.readLock().unlock(); } } /** * 通过ReentrantReadWriteLock添加写锁 * @param value */ public void setValueLock(int value) { lock.writeLock().lock(); try { this.value = value; } finally { lock.writeLock().unlock(); } } /** * 通过ReentrantLock添加读锁 * @return value * {@link ReadWriteLock} */ public int getValueNew() { locknew.lock(); try { return value; } finally { locknew.unlock(); } } /** * 通过ReentrantLock添加写锁 * @param value */ public void setValueNew(int value) { locknew.lock(); try { this.value = value; } finally { locknew.unlock(); } } /** * 通过synchronized添加读锁 * @return value */ public synchronized int getValueSyn() { return value; } /** * 通过synchronized添加写锁 * @param value */ public synchronized void setValueSyn(int value) { this.value = value; } /** * 测试方法 * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { //防止线程池大小过大,CPU过多的上下文切换导致的开销影响,线程池大小必须同总共开启的对象 int maxProcessor = READ_NUM + WRITE_NUM; final ExecutorService newFixedThreadPool = Executors .newFixedThreadPool(maxProcessor); final CountDownLatch latch = new CountDownLatch(READ_NUM + WRITE_NUM);// 最后关闭线程池 final CyclicBarrier barrier = new CyclicBarrier(READ_NUM + WRITE_NUM);// 等待所有线程启动后并发读写 final CurrentObject concurrentObject = new CurrentObject(); for (int i = 0; i < READ_NUM; i++) { newFixedThreadPool.execute(new Runnable() { @Override public void run() { try { barrier.await(); } catch (Exception e) { e.printStackTrace(); } TimeCostUtils.start(TimeCostUtils.READ); concurrentObject.getValueLock(); TimeCostUtils.end(); latch.countDown(); } }); } for (int i = 0; i < WRITE_NUM; i++) { newFixedThreadPool.execute(new Runnable() { @Override public void run() { int nextInt = random.nextInt(1000); try { barrier.await(); } catch (Exception e) { e.printStackTrace(); } TimeCostUtils.start(TimeCostUtils.WRITE); concurrentObject.setValueLock(nextInt); TimeCostUtils.end(); latch.countDown(); } }); } latch.await(); newFixedThreadPool.shutdown(); // 系统退出前,关闭线程池及计算平均耗时、总耗时 Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { display(); } })); } } import java.util.concurrent.atomic.AtomicLong; public class TimeCostUtils { private static AtomicLong readLong = new AtomicLong(); private static AtomicLong writeLong = new AtomicLong(); public final static String WRITE = "write"; public final static String READ = "read"; static ThreadLocal<TimesRecords> recordMap = new ThreadLocal<TimesRecords>(); public static void start(String prefix) { TimesRecords timesRecords = new TimesRecords(prefix, System.nanoTime()); recordMap.set(timesRecords); } public static void end() { TimesRecords timesRecords = recordMap.get(); long cost = System.nanoTime() - timesRecords.getCost(); // 计算每次的开销时间 if (timesRecords.getName().equals(WRITE)) { writeLong.addAndGet(cost); } else { readLong.addAndGet(cost); } } public static AtomicLong getReadLong() { return readLong; } public static AtomicLong getWriteLong() { return writeLong; } static class TimesRecords { private String name; private long cost; public TimesRecords(String name, long cost) { this.name = name; this.cost = cost; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getCost() { return cost; } public void setCost(long cost) { this.cost = cost; } } } 测试数据: ![20140426162602427.jpg][] 原文:[http://www.inter12.org/archives/292][http_www.inter12.org_archives_292] [java_ReentrantLock_sync_ReentrantReadWriteLock]: http://www.zuidaima.com/share/1796775925894144.htm [20140426162602427.jpg]: /images/20220722/a6a82694176d459a9779b0363637f814.png [http_www.inter12.org_archives_292]: http://www.inter12.org/archives/292
相关 Java多线程性能优化案例研究 在Java编程中,多线程是一种强大的工具,可以提高程序的响应速度。然而,如果管理不当,多线程也可能会导致性能瓶颈和资源浪费。 以下是一个关于Java多线程性能优化的案例研究: 左手的ㄟ右手/ 2024年09月11日 06:39/ 0 赞/ 58 阅读
相关 性能杀手:Java多线程编程陷阱 Java多线程编程确实存在一些陷阱,这些“性能杀手”可能会让开发者头疼。以下列举几个常见的问题: 1. **死锁**:多个线程互相等待对方释放资源,从而导致所有线程都无法继续 迈不过友情╰/ 2024年09月06日 01:27/ 0 赞/ 32 阅读
相关 多线程与单线程比较 给一个多行的txt文本文件,统计里面每个单词出现多少次(如下图) ![52db7d2ec63e411998b5b08344fb1e71.png][] 单线程代码: àì夳堔傛蜴生んèń/ 2024年04月01日 18:59/ 0 赞/ 83 阅读
相关 java集合之List线程安全性比较总结(性能比较) 文章目录 前言 一、背景 二、测试 三、详解 四、总结 总结 前言 介绍三种安装es-head插件的方式 1、Google 刺骨的言语ヽ痛彻心扉/ 2024年03月22日 17:38/ 0 赞/ 60 阅读
相关 Java多线程实现性能测试 1、创建多线程和线程池的代码: import java.util.concurrent.ExecutorService; import java.util ╰+攻爆jí腚メ/ 2023年02月09日 10:29/ 0 赞/ 2 阅读
相关 Java多线程 多线程性能问题--上下文切换,内存同步 文章目录 多线程性能问题--上下文切换,内存同步 性能问题有哪些体现, 什么是性能问题 为什么多线程会 ╰+哭是因爲堅強的太久メ/ 2022年12月03日 13:27/ 0 赞/ 145 阅读
相关 go和java线程_go协程goroutine与Java多线程比较 引言: 个人理解的线程,协程和单,多核线程 1. 单核CPU上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已(cpu时间切片), 系统给每个线程分配时 ╰半夏微凉°/ 2022年10月22日 13:53/ 0 赞/ 193 阅读
相关 java多线程ReentrantLock、sync、ReentrantReadWriteLock性能比较 原文:[java多线程ReentrantLock、sync、ReentrantReadWriteLock性能比较][java_ReentrantLock_sync_Reentr 绝地灬酷狼/ 2022年08月23日 00:58/ 0 赞/ 134 阅读
还没有评论,来说两句吧...