挥发性使用会降低性能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了挥发性使用会降低性能相关的知识,希望对你有一定的参考价值。
当我看到使用volatile
和synchronize
关键字会降低你的整体性能因此以下代码来制作单例类时,我正在阅读有关volatile的内容
public enum Singleton {
INSTANCE
}
最好是创建一个包含volatile实例和synchronized方法的singleton类来返回该静态实例。
虽然这两个类都是线程安全的并且给出了相同的期望结果。除了代码可读性之外,使用枚举还有任何性能优势。
synchronized
关键字定义会降低性能,因为它只允许一个线程处理同步代码块。使用synchronized
和volatile
创建单例类的唯一原因是为类的单个实例提供延迟初始化。
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
价格昂贵。当你不需要它时使用它是错误的(例如,在不共享的变量上使用它是错误的,并且在已经存在的共享变量上使用它将是错误的。受其他方式保护。)
以上是关于挥发性使用会降低性能的主要内容,如果未能解决你的问题,请参考以下文章