挥发性使用会降低性能

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挥发性使用会降低性能相关的知识,希望对你有一定的参考价值。

当我看到使用volatilesynchronize关键字会降低你的整体性能因此以下代码来制作单例类时,我正在阅读有关volatile的内容

public enum Singleton {
 INSTANCE 
} 

最好是创建一个包含volatile实例和synchronized方法的singleton类来返回该静态实例。

虽然这两个类都是线程安全的并且给出了相同的期望结果。除了代码可读性之外,使用枚举还有任何性能优势。

答案

synchronized关键字定义会降低性能,因为它只允许一个线程处理同步代码块。使用synchronizedvolatile创建单例类的唯一原因是为类的单个实例提供延迟初始化。

private static volatile ThreadSafeLazySingleton instance;

private ThreadSafeLazySingleton(){}

public static synchronized ThreadSafeLazySingleton getInstance(){
    if(instance == null){
         instance = new ThreadSafeLazySingleton();
    }
    return instance;
}

当实例化资源很多并且您希望将实例的创建延迟到最后一刻时,延迟初始化很有用。

通过使用Reflection并使用Singleton.class.getDeclaredConstructors()设置私有构造函数true访问constructor.setAccessible(true),可以打破类的单例设计。

使用enum设计单例类克服了上述缺点,因为Java确保枚举始终只实例化一次。但是,这种方法会丢失延迟初始化的好处。由于未使用同步,此方法将具有比同步方法更好的性能。

设计单例类的最佳方法是使用此answer中建议的方法

另一答案

也许volatile没有做你认为它做的事情。您的问题文本看起来像是在询问在多线程环境中安全发布单例的两种不同方法。但是,这不是volatile的用途。 volatile解决了一个更普遍的问题。

如果需要在不同的线程之间共享变量,则可以将变量声明为volatile,但不需要将synchronized与任何其他变量共享。 volatile声明确保线程在查看变量时,它总是会看到分配给它的最新值,即使该值是由其他某个线程分配的。

是。 volatile价格昂贵。当你不需要它时使用它是错误的(例如,在不共享的变量上使用它是错误的,并且在已经存在的共享变量上使用它将是错误的。受其他方式保护。)

以上是关于挥发性使用会降低性能的主要内容,如果未能解决你的问题,请参考以下文章

后台开发必知必会日常开发性能优化总结

竞争条件会降低代码的性能吗?

过度使用硬盘会降低硬盘驱动器的性能吗?

有旧的注释代码和代码中的大量空格会降低性能吗?

为啥 C++ 中的多线程会降低性能

渲染更多部分会降低 Rails Web 应用程序的性能吗?