Swa*_*rma 1 java synchronization
我有一个为单个线程编写的类,没有同步的方法.
class MyClass implements MyInterface{
//interface implementation methods, not synchronized
}
Run Code Online (Sandbox Code Playgroud)
但是我们还需要该类的同步版本.所以我们创建了一个包装类,它实现了相同的接口,但是有一个构造函数,它接受一个MyClass实例.对synchronized类的方法的任何调用都被委托给MyClass的实例.这是我的同步课程..
class SynchronizedMyClass implements MyInterface{
//the constructor
public SynchronizedMyClass(MyInterface i/*this is actually an instance of MyClass*/)
//interface implementation methods; all synchronized; all delegated to the MyInterface instance
}
Run Code Online (Sandbox Code Playgroud)
毕竟,我在这两个课程中进行了大量的测试.测试涉及读取日志文件和计算每行中的URL.问题是类的同步版本一直花费较少的时间进行解析.我只使用一个线程用于测试,因此没有死锁的机会,竞争条件等等.每个日志文件包含超过500万行,这意味着调用方法超过500万次.任何人都可以解释为什么班级迁移的同步时间比正常时间少吗?
首先,您应该阅读有关在Java中创建基准测试的信息:如何在Java中编写正确的微基准测试?
假设基准测试是好的,那么这里有一些可能的原因:
锁定省略:如果JVM可以注意到只能从一个线程调用该方法,它可以优化同步.
锁定粗化:JVM可以将多个同步块组合到一个块中,从而提高性能.也许JVM能够更好地优化方法的同步版本.
Java中的非竞争同步块很快,因此可能很难注意到差异(尽管应该有一些开销)并且性能差异的原因可能是由其他原因引起的.当存在争用时(即许多线程试图同时访问它),同步块变慢,在这种情况下,java.util.concurrent.locks和其他同步机制可能更快.
原因也可能是其他原因.也许JVM以不同的方式优化方法.要了解实际发生的情况,请查看JIT生成的本机代码:如何在JVM中查看JIT编译的代码?