单例模式,不多说了,这个模式和静态函数有什么区别,之前解释过了,不是今天重点。
这个贴的重点是,单例模式的这个单例,如何初始化。
其实单例的初始化有两种:一种是提前初始化,就是说,在程序使用单例时,先由其他程序保证这个实例已经初始化结束。
这个比较简单,也不是本贴的重点。
另外一种就是程序一开始不初始化,仅仅在单例第一次被调用的时候被初始化。
中间怎么演变就不说了。总之这里技巧是要解决一个矛盾:第一次使用时初始化,就必需要用同步机制,在对象使用前是否已经初始化。
但是加锁后,极大的降低了程序的性能,尤其判断比较复杂的时候。曾经有文章在设计模式界批判“单例是魔鬼”就出于此。
现在很多的补充做法可以尽量的避免这种方式。文字不好解释,给个代码模型吧。
public class Singl{
/**
*单例形成,不允许外部实例化
*/
private Singl(){
}
private static Singl instance;
private Object lock = new Object();
private static Singl getSingl(){
if (instance == null){//第一次判断不要同步
synchronized(lock){//第二次在上锁同步,且要再判断一次
if (instance == null){//第一次判断不要同步
instance = new Singl()
}
}
}
return instance;
}
}
搞定!
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
这样的实现既保证了单例的唯一性,又实现了惰性初始化。 单例模式虽然有很多优点,但也存在一些潜在问题,比如它可能造成难以测试的代码,因为它隐藏了依赖关系。此外,过度使用单例可能导致代码过于紧密耦合,不...
它在`getInstance()`方法中加入两次检查`instance`是否为null,只有在确认未初始化时才进行同步创建。这种方式在Java早期版本中可能存在问题,但在JVM的内存模型改进后,已成为一种有效的实现方式。 4. **静态内部...
3. **惰性初始化**:只有当确实需要时才进行实例化。 4. **线程安全**:在多线程环境下也能正确工作。 #### 使用场景 - 数据库连接管理:通过单例模式可以有效地控制数据库连接资源,避免频繁地打开和关闭连接导致...
例如:`工厂方法模式`(Factory Method)、`抽象工厂模式`(Abstract Factory)、`建造者模式`(Builder)、`原型模式`(Prototype)和`单例模式`(Singleton)等。 2. **结构型模式(Structural Patterns)**:...
Java 中的惰性计算和惰性迭代器 惰性计算是许多函数式编程语言的特性,它允许延迟表达式的求值,直到实际需要时再计算。这篇文章将探索 Java 中的惰性计算,讨论其原理、优点和实现方式。 惰性计算的优点 惰性...
【标题】"Scala集合(二)Java开发Java经验技巧共10页" 指的是一份关于Scala集合和Java开发技巧的文档,该文档共包含10页内容,可能是详细讲解了如何在Scala编程中使用集合,并结合了Java开发的经验和技巧。...
懒惰收集用于 Java 的非严格(惰性)集合,其中可以基本上形成一系列函数,并且仅根据需要执行评估。 它使用 Java 7 作为默认 JDK 版本。 该项目针对 JDK 7,因此不会有 lambda 和 java 8 流支持。 如果您正在寻找 ...
在大型项目中,通过模块化的单例模式,可以实现更好的模块性和代码组织性。此外,单例模式允许每个模块惰性加载,从而在需要时才加载和执行相应的代码,这对于提升应用性能尤其重要。总结起来,单例模式在代码维护、...
这种方式通常用于当实例化对象需要一些时间或资源时,可以避免在程序启动时就进行不必要的初始化。以下是一个惰性单例模式的HTML页面示例: ```html <!DOCTYPE html> , initial-scale=1.0"> 惰性单例模式 ...
Java正则表达式是编程语言中用于处理字符串的强大工具,其中两种重要的匹配模式是贪婪匹配和惰性匹配。这两种模式涉及到正则表达式中的量词,它们决定了匹配字符的次数和方式。 贪婪量词(Greedily Quantifiers)在...
主要是由于Java内存模型的问题,新创建的对象可能在构造完成之前就被其他线程看到,导致`instance`变量处于未完全初始化的状态。不过,现代JVM已经解决了这些问题,因此在现代Java环境中,这种方法是可以接受的。 #...
实现单例模式的方法有很多,其中一种简单的方式是惰性实例化,这种方式直到对象被要求时才进行初始化。但是,这种实现并不适合多线程环境,因为在多个线程同时执行实例检查和实例化的过程中,可能会产生多个实例,...
- 惰性初始化,是指在第一次使用成员变量时才进行初始化,通常用于避免不必要的计算或资源消耗。 2. **数据类型**: - Java有基本数据类型(如int、char、boolean等)和引用数据类型(如类、接口和数组)。 - ...
5. **延迟初始化和惰性加载**:只有在真正需要时才初始化对象,例如使用Double-Checked Locking或枚举单例实现。 6. **并发优化**:在多线程环境下,使用并发集合类如ConcurrentHashMap,避免synchronized关键字的...
单例模式的例子:闭包实现私有成员的单例模式例子:var Ellyliang = (function() {闭包实现私有成员的惰性实例化单例模式:var Elly
为了提高效率,可以使用“惰性初始化”(lazy initialization),即只有在首次访问时才创建实例: ```python class Singleton(object): _instance = None _lock = threading.Lock() def __new__(cls, *args, **...
1. **懒汉式**:也称为惰性初始化,只有在第一次调用getInstance()方法时才创建单例对象。优点是线程安全,缺点是多线程环境下可能会造成多个实例。 ```java public class Singleton { private static Singleton...
总的来说,JavaScript的单例模式通过控制类的实例化,确保了全局环境中只有一个特定对象的存在,这在处理共享资源和优化性能时非常有用。通过不同的实现方式,我们可以根据需求选择最适合的单例模式实现。
推荐的第三种方法是采用惰性初始化(Lazy Initialization)并结合缓存。只有在真正需要格式化日期时才创建`NSDateFormatter`,并且创建后将其存储在一个字典或数组中,根据特定的格式作为键。这样,当再次需要相同...