`
banxi1988
  • 浏览: 153910 次
  • 性别: Icon_minigender_1
  • 来自: 桂林
社区版块
存档分类
最新评论

Java线程安全的单例模式

    博客分类:
  • java
阅读更多
在Java并发编程实践(JAVA concurrency in practice)中的第十六章(Java存储模型)中.
有讲到对象安全发布.
其中就是以单例模式来说明这个安全初始化技巧的.这是学习分析总结如下:
   
引用

不正确发布带来的风险的真正原因是在"发布共享对象"与从"另一个线程访问它"之间,缺少happens-before排序.

     不安全的发布.
发布(Publishing):
引用

发布(Publishing)一个对象的意思是使它能够被当前范围之处的代码所使用.比如将一个引用
存储到其他代码可以访问的地方.在一个非千私有的方法中返回这个引用,也可以把它传递到其他类的方法中.在很多情况下,我们需要确保对象及它们的内部状态不被暴露(publish).


代码清单1:不安全的惰性初始化:
public class UnsafeLazyInitialization{
 private static Resource resource;
 public static Resource getInstance(){
   if(resource == null){
     resource = new Resource();
   }
return resource;
}
}


引用

除了不可变对象以外,使用被另一个线程初始化的对象,是不安全的,除非对象的发布是happens-before于对象的消费线程使用它.

安全初始化技巧:
代码清单2 线程安全的惰性初始化
public class SafeLazyInitialization{
 private static Resource resource;
  public synchronized static Resource getInstance(){
        if(Resource == null){
         resource = new Resource();
        }
  }
}



代码清单3 主动初始化
public class EagerInitialization{
  private static Resource resource = new Resource();
  public static Resource getResource() {
   return resource;
  }
}


像上面那样,使用主动的初始化,避免了每次调用SafeLazyInitialization的getInstance()的同步开销.这项技术可以和JVM的惰性类加载相结合,
创建一种惰性初始化技术,使得在通常的代码路径中都不需要同步.清单4的惰性初始化holder类技巧.使用一个专门用来初始化Resource的类.JVM将ResourceHolder的初始化被 延迟到真正使用它的时刻.因为Resource是在静态初始进行初始化的,所以不再需要额外的同步.,线程第一次调用getResource,引起ResourceHolder的加载和初始化,这个时候,正是静态初始阶段Resource完成初始化发生的时间.

清单4惰性初始化Holder类技巧
public class ResourceFactory{
 private static ResourceHolder {
     public static Resource resource = new Resource();
 }
public static Resource getResource(){
 return ResourceHolder.resource;
}
}
0
0
分享到:
评论

相关推荐

    Java中懒汉单例设计模式线程安全测试

    Java中懒汉单例设计模式线程安全测试,单例设计模式的测试

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    线程安全的单例模式

    ### 线程安全的单例模式详解 #### 一、单例模式简介 单例模式(Singleton Pattern)是软件开发中最常用的创建型设计模式之一,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。单例模式在很多场景下...

    Java实现多种单例模式

    在Java编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。这种模式在需要频繁创建和销毁对象的场景中尤其有用,因为它可以节省系统资源并确保对象间的协调一致。以下是...

    Java 单例模式线程安全问题

    Java 单例模式线程安全问题详解 Java 单例模式线程安全问题是指在 Java 中实现单例模式时,如何确保线程安全的问题。单例模式是指在整个应用程序生命周期中,只有一个实例存在的设计模式。这种模式可以提高性能,...

    java中的单例模式

    Java中的单例模式是一种设计模式,它用于保证一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要控制实例数量,特别是当这个实例需要频繁地被多个对象共享时非常有用,例如数据库连接池、线程池或者...

    java 多线程单例模式详解

    ### Java多线程单例模式详解 #### 一、单例模式概述 单例模式(Singleton Pattern)是一种常用的软件设计模式,它确保一个类仅有一个实例,并提供一个全局访问点。这种模式通常用于那些需要频繁实例化然后销毁的...

    Java线程安全中的单例模式

    本篇文章将详细探讨Java线程安全中的单例模式。 首先,我们来看给定代码中的一种实现方式,也被称为"静态内部类"或"双检锁"(Double-Checked Locking)模式。这段代码如下: ```java package net.kitbox.util; ...

    线程安全单例

    然而,在多线程环境下,如果单例模式实现不当,则可能导致线程安全问题。因此,实现线程安全的单例模式就显得尤为重要。 #### 实现方法 给定的代码示例采用了一种称为“懒汉式”的单例模式实现方式,同时利用了...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    多线程单例模式并发访问

    ### 多线程单例模式并发访问 #### 一、多线程基础概念 在讨论多线程单例模式及并发访问之前,我们先来了解一些基本概念。 **进程**和**线程**是计算机科学中的两个核心概念,它们之间的关系紧密而复杂。 - **进程...

    浅议单例模式之线程安全(转)

    以上就是单例模式在Java中的常见实现方式,其中线程安全的实现包括饿汉式、静态代码块、双重检查锁定、静态内部类以及枚举方式。在实际应用中,应根据项目需求选择适合的单例实现方式,考虑到性能和线程安全等因素。...

    Java中线程安全的单例模式:深入理解与实践

    在实现线程安全的单例模式时,选择哪种方法取决于具体的应用场景。如果应用启动时间不是关键,并且希望尽可能减少内存消耗,可以选择懒汉式;如果应用对性能要求较高,可以选择饿汉式或静态内部类。双重校验锁则适用...

    java设计模式之单例模式.zip

    在Java中实现单例模式有多种方法: 1. **饿汉式(静态常量)**:在类加载时就完成了初始化,所以没有线程安全问题,但这种实现方式无法实现延迟加载。 ```java public class Singleton { private static final ...

    Java 单例模式.pptx

    - **线程安全问题**:懒汉式单例模式在多线程环境下可能会导致创建多个实例,因此需要采用同步机制保证线程安全,例如使用`synchronized`关键字。 - **静态内部类方式** - **实现**: ```java class Single3 {...

    单例模式各种实现方式

    在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的...

    java多线程之线程安全的单例模式

    本文将详细介绍Java中线程安全的单例模式,包括懒汉式和饿汉式两种实现方式。 1. 饿汉式单例模式 饿汉式单例在类加载时就完成了实例化,因此它是线程安全的。在Java中,饿汉式通常通过静态初始化器(static block...

    深入探索Java中的单例模式:实现、应用与最佳实践

    在Java中实现单例模式有多种方法,每种方法都有其特点和适用场景。本文将详细介绍几种常见的单例模式实现方式,并探讨它们在实际开发中的应用和最佳实践。 在实现单例模式时,应注意以下几点: 确保单例类不被继承...

Global site tag (gtag.js) - Google Analytics