多线程之 单例设计模式
饿汉式 多线程安全代码:
代码1:
/**
* 饿汉式
* */
class Single {
private static final Single s = new Single();
private Single(){}
static Single getInstance()
{
return s;
}
public void show()
{
System.out.println(Thread.currentThread().getName()+":"+s);
}
}
class A implements Runnable{
@Override
public void run() {
Single.getInstance().show();
}
}
class Test
{
public static void main(String[] args) {
A a = new A();
Thread b = new Thread(a);
Thread c = new Thread(a);
Thread e = new Thread(a);
Thread f = new Thread(a);
b.start();
try { Thread.sleep(100);} catch (InterruptedException ex) {};
c.start();
try { Thread.sleep(100);} catch (InterruptedException ex) {};
e.start();
try { Thread.sleep(100);} catch (InterruptedException ex) {};
f.start();
}
}
运行结果:
多线程安全性:多线程安全
分析:这种静态初始化的方法是自己被加载时就自己实例化,被形象的称之为饿汉式单例类。而原先的单例模式处理方式要在第一次被引用的时候才会被实例化,就被称为懒汉式单例类。
优缺点:这样导致类加载慢,但运行快。
不安全懒汉式示例:
代码2:
class Single {
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
return s = new Single();
return s;
}
public void show()
{
System.out.println(Thread.currentThread().getName()+":"+s);
}
}
class A implements Runnable{
@Override
public void run() {
Single.getInstance().show();
}
}
class Test
{
public static void main(String[] args) {
A a = new A();
Thread b = new Thread(a);
Thread c = new Thread(a);
Thread e = new Thread(a);
Thread f = new Thread(a);
Thread b1 = new Thread(a);
Thread c1 = new Thread(a);
Thread e1 = new Thread(a);
Thread f1 = new Thread(a);
b.start();
c.start();
e.start();
f.start();
b1.start();
c1.start();
e1.start();
f1.start();
}
}
运行结果:
懒汉式多线程安全单例类:
代码3:
/**
* 多线程安全 懒汉式
* */
class Single {
private volatile static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized (Single.class) {
if(s==null)
return s = new Single();
}
}
return s;
}
public void show()
{
System.out.println(Thread.currentThread().getName()+":"+s);
}
}
class A implements Runnable{
@Override
public void run() {
Single.getInstance().show();
}
}
class Test
{
public static void main(String[] args) {
A a = new A();
Thread b = new Thread(a);
Thread c = new Thread(a);
Thread e = new Thread(a);
Thread f = new Thread(a);
Thread b1 = new Thread(a);
Thread c1 = new Thread(a);
Thread e1 = new Thread(a);
Thread f1 = new Thread(a);
b.start();
c.start();
e.start();
f.start();
b1.start();
c1.start();
e1.start();
f1.start();
}
}
运行结果:
分析:使用了同步代码块,这样每个线程都必须等,当前执行的线程完成操作后才能进去,达到多线程安全编程;可这样也是程序运行效率下降;在同步代码块外在判断一次是否为null,这样程序的运行效率就就会好点了。
同步锁:静态的同步方法,使用的锁是该方法所在类的字节码文件对象,类名.class。
优缺点:加载类快,对象实例延迟加载,第一次运行较慢,还是很不错的。
这个测试有点麻烦,测试好多次才能看到问题,建议大家可以结合使用 线程的sleep()方法来测试,见效快。
分享到:
相关推荐
在Java编程语言中,设计模式是一种经过验证的解决常见软件设计问题的最佳实践。单例模式是其中最常用的一种,它的核心思想是确保一个类只有一个实例,并提供全局访问点。单例模式的应用场景包括:控制资源的访问、...
设计模式-单例模式 单例模式是一种常见的设计模式,它的主要作用是确保在内存中仅创建一次对象,并提供一个全局访问点。单例模式有两种类型:饿汉类型和懒汉类型。 饿汉类型的单例模式是在类加载时创建对象,例如...
**设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...
### 设计模式—单例设计模式详解 #### 定义 单例模式是一种常见的创建型设计模式,其核心思想在于确保一个类仅有一个实例存在,并且该实例由该类自行创建,随后向整个系统提供这一唯一实例。 #### 类图解析 在设计...
单例模式是软件设计模式中的一种经典模式,它在Java编程中被广泛使用。这个模式的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于可以控制实例的数量,减少资源消耗,同时便于协调整个...
本资源“一例读懂设计模式-单例模式、简单工厂模式.zip”旨在帮助初学者通过实例深入理解这两种重要设计模式:单例模式和简单工厂模式。以下是关于这两个模式的详细讲解。 1. **单例模式**: 单例模式是一种限制类...
单例模式是一种软件设计模式,它的核心思想是确保一个类在整个应用程序中只有一个实例,并提供一个全局访问点来获取这个实例。这种模式在iOS开发中非常常见,因为许多系统类如UIApplication、NSFileManager等都采用...
单例设计模式是一种常用的设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式通常有多种方式,包括懒汉模式、饿汉模式、静态内部类以及枚举类型。 1. **懒汉模式**: 懒汉...
**单例模式**是软件设计模式中的一种,属于创建型模式。在C++中,单例模式确保一个类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,如数据库连接、日志系统或者配置文件等。单例模式的主要...
单例模式是一种常用的软件设计模式,特别是在iOS开发中,它确保一个类仅有一个实例,并提供一个全局访问点。iOS SDK中广泛应用了单例模式,比如UIApplication和NSFileManager等类就是以单例形式存在。 在iOS开发中...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供全局访问点。这种模式在许多场景下非常有用,比如控制共享资源、管理系统级别的对象,如数据库连接池或者线程池等。单例模式的核心在于限制类的...
### Java设计模式——单例模式详解 #### 一、单例模式概述 单例模式是设计模式中的一个重要组成部分,属于创建型模式之一。其主要作用是确保某个类仅有一个实例存在,并提供一个全局访问该实例的方法。这在很多场景...
单例模式是软件设计模式中的一种经典模式,其主要目的是保证一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,包括简单实现、双重检查锁定(Double-Checked Locking)、静态内部类和...
单例模式是软件设计模式中的一种经典模式,它旨在确保一个类只有一个实例,并提供一个全局访问点。在C#编程中,单例模式的应用广泛,特别是在需要频繁实例化然后销毁的对象,或者创建对象需要消耗大量资源的情况下,...
在iOS应用开发中,单例模式是一种常用的编程设计模式,它确保了类只有一个实例,并提供一个全局访问点。这个模式在iOS开发中的应用非常广泛,特别是在处理系统资源、网络请求、数据存储等需要全局共享的对象时。在...
单例模式是软件设计模式中的一种经典模式,它确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。以下是对单例模式的详细...
单例设计模式是一种常用的设计模式,它在软件工程中用于控制类的实例化过程,确保一个类在整个系统中只有一个实例存在。在C#编程中,单例模式的应用非常广泛,尤其是在处理全局配置、数据库连接或者日志记录等场景。...
单例模式是软件设计模式中的一种,用于控制类的实例化过程,确保一个类只有一个实例,并提供全局访问点。在Java中,实现单例模式有多种方法,每种方法都有其特点和适用场景。以下是对这六种常见单例模式实现方式的...
但是,单例模式也有一些潜在的问题,如测试困难(因为无法通过构造函数注入依赖)、难以进行并行编程(多线程环境下需要特殊处理)以及可能导致全局状态的滥用等。 接下来是适配器模式(Adapter Pattern)的介绍。...