1 理解下单例模式中 两个 if(null == instance)的判断存在的原因
2 理解下载 .class上加锁的写法(对于没法使用实例对象加锁的,比如下面类是单例类,只能在 .class中加锁)
/** * 单例设计模式:确保一个类只有一个对象 * @author Administrator * */ public class SynDemo02 { /** * @param args */ public static void main(String[] args) { JvmThread thread1 = new JvmThread(100); JvmThread thread2 = new JvmThread(500); thread1.start(); thread2.start(); } } class JvmThread extends Thread{ private long time; public JvmThread() { } public JvmThread(long time) { this.time =time; } @Override public void run() { System.out.println(Thread.currentThread().getName()+"-->创建:"+Jvm.getInstance(time)); } } /** * 单例设计模式 * 确保一个类只有一个对象 * 懒汉式 double checking * 1、构造器私有化,避免外部直接创建对象 * 2、声明一个私有的静态变量 * 3、创建一个对外的公共的静态方法 访问该变量,如果变量没有对象,创建该对象 */ class Jvm { //声明一个私有的静态变量 private static Jvm instance =null; //构造器私有化,避免外部直接创建对象 private Jvm(){ } //创建一个对外的公共的静态方法 访问该变量,如果变量没有对象,创建该对象 public static Jvm getInstance(long time){ //2 然后线程 c d e 进来访问,此时a线程已经完成instance的实例化,因此 c d e 现在在这个if判断中直接跳出得到instance对象, 这就是这个if判断存在的作用 if(null==instance){ // //1 a b线程先过来,此时instance为Null,然后a b线程进来,假如a线程先获取到锁,进入后进行创建instance对象,然后释放锁,然后b线程进来,此时的if(null==instance )判断成功让b线程直接获取a已经创建好的实例返回,这就是这个if判断的作用 synchronized(Jvm.class){ if(null==instance ){ try { Thread.sleep(time); //延时 ,放大错误 ,即使不设置这个延迟,在实际中 创建对象也会有延迟。 } catch (InterruptedException e) { e.printStackTrace(); } instance =new Jvm(); } } }//a return instance; } public static Jvm getInstance3(long time){ //a b c d e -->效率不高, 任何时候多线程过来都需要等待,存在对象也需要等待 synchronized(Jvm.class){ if(null==instance ){ try { Thread.sleep(time); //延时 ,放大错误 } catch (InterruptedException e) { e.printStackTrace(); } instance =new Jvm(); } return instance; } } public static synchronized Jvm getInstance2(long time){ if(null==instance ){ try { Thread.sleep(time); //延时 ,放大错误 } catch (InterruptedException e) { e.printStackTrace(); } instance =new Jvm(); } return instance; } public static Jvm getInstance1(long time){ if(null==instance ){ try { Thread.sleep(time); //延时 ,放大错误 } catch (InterruptedException e) { e.printStackTrace(); } instance =new Jvm(); } return instance; } }
相关推荐
在QT中,单例模式、多线程以及双重校验加锁(Double-Checked Locking)是常见的编程模式和技术,尤其在处理并发和资源管理时显得尤为重要。 **单例模式** 是一种设计模式,确保一个类只有一个实例,并提供一个全局...
特别是在现代软件开发中,考虑到多线程环境、类加载机制以及序列化等因素的影响,合理地设计和实现单例模式变得尤为重要。通过上述讨论,我们可以看到单例模式在不同场景下的适用性及其潜在问题,并学习到了相应的...
这种方式线程安全,且因为单例在类加载时已经创建,所以不存在多线程同步问题,但可能会造成内存浪费,因为即使没有使用,单例也会被创建。 ```java public class Singleton { private static final Singleton ...
这种写法也保证了懒汉式单例的线程安全,并且可以避免加锁带来的性能损失。 在 Java 中,类加载器加载内容的顺序是从上往下,静态后动态,先属性后方法。 Java 类加载器会先加载静态变量,然后加载对象实例化,最后...
饿汉式单例是在类初始化时,已经自行实例化的单例模式。这种方式的优点是简单、线程安全,但缺点是如果这个类很少使用,但创建过程很耗时,那么这个创建过程就是无用的。 ```java public class Singleton { // ...
双重检查锁单例模式(Doubly Checked Locking Singleton)是懒汉式单例模式的一种改进版,既实现了延迟加载,又解决了多线程安全问题,同时也减少了同步的开销。具体实现如下: ```java public class UserService { ...
由于单例模式涉及到全局共享资源的访问,因此在多线程环境下需要特别注意同步问题。下面是一些常见的实现方式: 1. **懒汉式,线程不安全**:这种方式简单,但是不支持多线程,容易引发竞态条件。 ```java ...
在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的详细解释: 1. **饿汉式(静态常量)** 这是最简单的单例实现,它在类加载时就创建了实例,线程安全。 `...
饿汉模式在类加载时完成实例化,是线程安全的,而懒汉模式需要额外的同步机制如互斥锁来保证线程安全。双重检查锁定是一种优化策略,可以减少不必要的锁操作。在C++11及更高版本中,可以利用`std::call_once`等特性...
1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了实例化,避免了线程同步问题。代码如下: ```java public class Singleton { private static final Singleton INSTANCE = new ...
- 在类加载时就完成了初始化,避免了线程同步问题。 - 如果实例化单例对象的过程非常快速且占用内存很小,则这种方式较为合适。 - 如果单例对象的初始化耗时较长或占用大量内存,或者仅在特定场景下使用,则不适合...
线程不安全的单例模式通常指的是“饿汉式”单例,即在类加载时就完成了初始化,这种方式虽然简单,但并不适用于多线程环境。例如: ```java public class Singleton { private static final Singleton INSTANCE = ...
单例模式是软件设计模式中的一种经典模式,它在软件体系结构中扮演着重要的角色。这个模式的主要目的是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种设计模式广泛应用于...
饿汉式单例是在类加载时就完成了实例化,这种方式线程安全,同时也避免了同步带来的性能影响。代码如下: ```csharp public sealed class Singleton { private static readonly Singleton instance = new ...
静态内部类的单例模式结合了懒汉式和饿汉式的优点,既延迟初始化,又线程安全。内部类不会随着外部类的加载而加载,只有在调用 `getInstance` 时,才会初始化内部类,从而创建实例。 ```java public class ...
}}在双重检查锁(Double-Checked Locking)实现中,第一次检查是在不加锁的情况下进行的,只有当第一次检查后 instance 仍然为 null 时,才会进入同步代码块进行第二次检查和实例化。这种方式提高了并发性能,因为...
JAVA多线程并发下的单例模式应用 单例模式是设计模式中比较简单的一个,也是...在多线程并发下的单例模式应用中,我们需要考虑线程安全问题,可以使用synchronized关键字、双重检查加锁机制或枚举类型来实现单例模式。
使用静态内部类的方式实现单例模式,结合了饿汉式的线程安全性和懒汉式的延迟加载。 **代码示例:** ```java public class Singleton { private static class SingletonHolder { private static final Singleton...
单例模式在实际开发中具有多种实现方式,每种方式都有其特点和应用场景。 #### 二、单例模式的特点 1. **全局唯一性**:确保在整个应用程序中只存在一个实例。 2. **对外提供唯一的访问点**:使得系统中的其他对象...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、日志系统或者配置管理等,因为这些都需要一个全局共享的对象...