同步代码比非同步代码执行速度更快
我出来了这个惊人的结果,我绝对不知道原因:我有两种方法缩写为:
private static final ConcurrentHashMap mapBoolean = new ConcurrentHashMap(); private static final ConcurrentHashMap<Double,LinkedBlockingQueue> map = new ConcurrentHashMap<Double, LinkedBlockingQueue>(); protected static Future execute(final Double id, Callable call){ // where id is the ID number of each thread synchronized(id) { mapBoolean.get();// then do something with the result map.get();//the do somethign with the result } } protected static Future executeLoosely(final Double id, Callable call){ mapBoolean.get();// then do something with the result map.get();//the do somethign with the result }
}
在使用超过500个线程进行分析时,每个线程分别调用上述每个方法400次,我发现execute(..)执行至少比executeLoosely(..)好500倍,这很奇怪,因为executeLoosely不是同步的,因此更multithreading可以同时处理代码。
任何原因?
在我假设没有500个核心的机器上使用500个线程的开销,使用大约100-1000x的任务,只要在Map上执行查找以执行JVM可以检测到的代码就没有做任何事情,是可能产生随机结果。 ;)
您可能遇到的另一个问题是,使用synchronized执行更快的测试可以从使用synchronized中受益,因为它会偏向对一个线程的访问。 即它将您的multithreading测试变回单个线程测试,这是首先最快的。
您应该将您获得的时间与执行循环的单个线程进行比较。 如果这更快(我相信它会),那么它不是一个有用的multithreading测试。
我的猜测是你在非同步代码之后运行同步代码。 即JVM已经预热了一点。 交换执行这些测试的顺序并运行它们多次,您将得到不同的结果。
在非同步场景中:1)等待获取地图片段上的锁定,锁定,对地图执行操作,解锁,等待获取其他地图的片段上的锁定,锁定,在其他地图上执行操作,开锁。 段级锁定仅在并发写入段的情况下执行,在您的示例中看起来不是这种情况。
在同步方案中:1)等待锁定,执行两个操作,解锁。
上下文切换所需的时间会产生影响吗? 运行测试的机器有多少个核心? 地图是如何构建的,同样的键?
- 将-javaagent添加到Tomcat 6服务器,我在哪里放置它以什么格式?
- 使用来自database.Dailed设置行的数据填充TableView
- Java:multithreading和UDP套接字编程
- EclipseLink 2.7.0和JPA API 2.2.0 – 签名不匹配
- 如何根据标点符号和空格分割字符串?
- org.hibernate.PersistentObjectException:传递给持久exception的分离实体
- 如何设计可能使用skip的返回流
- 为什么@FunctionalInterface具有RUNTIME保留?
- 在spring哪里可以捕获非rest控制器exception?