`

线程同步加锁在class类上 和 单例模式

 
阅读更多

 

 

 

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单例模式、多线程、双重校验加锁

    在QT中,单例模式、多线程以及双重校验加锁(Double-Checked Locking)是常见的编程模式和技术,尤其在处理并发和资源管理时显得尤为重要。 **单例模式** 是一种设计模式,确保一个类只有一个实例,并提供一个全局...

    单例模式,single

    特别是在现代软件开发中,考虑到多线程环境、类加载机制以及序列化等因素的影响,合理地设计和实现单例模式变得尤为重要。通过上述讨论,我们可以看到单例模式在不同场景下的适用性及其潜在问题,并学习到了相应的...

    设计模式之单例模式源码demo

    这种方式线程安全,且因为单例在类加载时已经创建,所以不存在多线程同步问题,但可能会造成内存浪费,因为即使没有使用,单例也会被创建。 ```java public class Singleton { private static final Singleton ...

    Java设计模式之单例模式的七种写法

    这种写法也保证了懒汉式单例的线程安全,并且可以避免加锁带来的性能损失。 在 Java 中,类加载器加载内容的顺序是从上往下,静态后动态,先属性后方法。 Java 类加载器会先加载静态变量,然后加载对象实例化,最后...

    单例模式详解

    饿汉式单例是在类初始化时,已经自行实例化的单例模式。这种方式的优点是简单、线程安全,但缺点是如果这个类很少使用,但创建过程很耗时,那么这个创建过程就是无用的。 ```java public class Singleton { // ...

    Java单例模式应用研究.pdf

    双重检查锁单例模式(Doubly Checked Locking Singleton)是懒汉式单例模式的一种改进版,既实现了延迟加载,又解决了多线程安全问题,同时也减少了同步的开销。具体实现如下: ```java public class UserService { ...

    单例模式 Singleton Pattern

    由于单例模式涉及到全局共享资源的访问,因此在多线程环境下需要特别注意同步问题。下面是一些常见的实现方式: 1. **懒汉式,线程不安全**:这种方式简单,但是不支持多线程,容易引发竞态条件。 ```java ...

    java-单例模式几种写法

    在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的详细解释: 1. **饿汉式(静态常量)** 这是最简单的单例实现,它在类加载时就创建了实例,线程安全。 `...

    详解C++实现线程安全的单例模式

    饿汉模式在类加载时完成实例化,是线程安全的,而懒汉模式需要额外的同步机制如互斥锁来保证线程安全。双重检查锁定是一种优化策略,可以减少不必要的锁操作。在C++11及更高版本中,可以利用`std::call_once`等特性...

    设计模式之单例模式

    1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了实例化,避免了线程同步问题。代码如下: ```java public class Singleton { private static final Singleton INSTANCE = new ...

    单例模式.doc

    - 在类加载时就完成了初始化,避免了线程同步问题。 - 如果实例化单例对象的过程非常快速且占用内存很小,则这种方式较为合适。 - 如果单例对象的初始化耗时较长或占用大量内存,或者仅在特定场景下使用,则不适合...

    单例模式的各个版本

    线程不安全的单例模式通常指的是“饿汉式”单例,即在类加载时就完成了初始化,这种方式虽然简单,但并不适用于多线程环境。例如: ```java public class Singleton { private static final Singleton INSTANCE = ...

    软件体系结构单例模式

    单例模式是软件设计模式中的一种经典模式,它在软件体系结构中扮演着重要的角色。这个模式的主要目的是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来获取这个唯一的实例。这种设计模式广泛应用于...

    C#设计模式学习与演变过程-2-单例模式

    饿汉式单例是在类加载时就完成了实例化,这种方式线程安全,同时也避免了同步带来的性能影响。代码如下: ```csharp public sealed class Singleton { private static readonly Singleton instance = new ...

    17-Java单例模式的学习笔记1

    静态内部类的单例模式结合了懒汉式和饿汉式的优点,既延迟初始化,又线程安全。内部类不会随着外部类的加载而加载,只有在调用 `getInstance` 时,才会初始化内部类,从而创建实例。 ```java public class ...

    单例模式简介和java代码实现

    }}在双重检查锁(Double-Checked Locking)实现中,第一次检查是在不加锁的情况下进行的,只有当第一次检查后 instance 仍然为 null 时,才会进入同步代码块进行第二次检查和实例化。这种方式提高了并发性能,因为...

    JAVA多线程并发下的单例模式应用

    JAVA多线程并发下的单例模式应用 单例模式是设计模式中比较简单的一个,也是...在多线程并发下的单例模式应用中,我们需要考虑线程安全问题,可以使用synchronized关键字、双重检查加锁机制或枚举类型来实现单例模式。

    JavaSE单例模式各种写法.doc

    使用静态内部类的方式实现单例模式,结合了饿汉式的线程安全性和懒汉式的延迟加载。 **代码示例:** ```java public class Singleton { private static class SingletonHolder { private static final Singleton...

    java单例模式

    单例模式在实际开发中具有多种实现方式,每种方式都有其特点和应用场景。 #### 二、单例模式的特点 1. **全局唯一性**:确保在整个应用程序中只存在一个实例。 2. **对外提供唯一的访问点**:使得系统中的其他对象...

    第五讲:单例模式

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、日志系统或者配置管理等,因为这些都需要一个全局共享的对象...

Global site tag (gtag.js) - Google Analytics