Java 单例模式的实现资料整理

Java单例模式的实现,对java 单例模式的几种实现方法进行了整理:

单例模式好多书上都是这么写的:

public class SingleTon1 {

  private SingleTon1(){
  }

  private static SingleTon1 instance = null;

  public static SingleTon1 getInstance(){
    if(instance == null){
      instance = new SingleTon1();
    }
    return instance;
  }
}

  但是实际开发中是不会这么写的,因为有一个严重的问题,多线程并发访问的时候,可能会产生多个实例!!

下面列举几个常用的方法:

1.使用synchronized 关键字

package singleton;

public class SingleTon1 {

  private SingleTon1(){

  }

  private static SingleTon1 instance = null;

  //多线程问题解法一,但是效率不高!因为每次调用都会加锁!
  public static synchronized SingleTon1 getInstance(){
    if(instance == null){
      instance = new SingleTon1();
    }
    return instance;
  }
  public void print(){
    System.out.println("thread_id:"+Thread.currentThread().getId());
  }

  private static Object object = new Object();
  //很巧妙的方法,只有在null的时候加锁,之后就不加啦
  public static SingleTon1 getInstance2(){

    if(instance == null){
      synchronized (object){
        instance = new SingleTon1();
      }
    }
    return instance;
  }

}

 2.加锁

package singleton;

import java.util.concurrent.locks.ReentrantLock;

public class SingleTon2 {

  private SingleTon2(){

  }
  private static ReentrantLock lock = new ReentrantLock();
  private static SingleTon2 instance = null;

  public void print(){
    System.out.println("thread_id:"+Thread.currentThread().getId());
  }

  public static SingleTon2 getInstance2(){

    if(instance == null){
      lock.lock();
      if(instance == null){ //注意这里还要判断下!!
        instance = new SingleTon2();
      }
      lock.unlock();
    }
    return instance;
  }
}

  3.利用静态变量:

package singleton;

public class SingleTon3 {

  public static void print(){
    System.out.println("thread_id:"+Thread.currentThread().getId());
  }

  public static Nested getNested(){

    return Nested.instance;
  }
  //这个是单例创建的类
  static class Nested{
   private Nested(){
    }
  static Nested instance = new Nested();
  }
}

以上就是常用的创建单例的模式:

Test测试代码:


package singleton;

import singleton.SingleTon3.Nested;

public class Test2 {

  public static void main(String[] args) {
    // TODO Auto-generated method stub
    Nested singleton;
    Myrunnable mm = new Myrunnable();
    Myrunnable m1 = new Myrunnable();

    Myrunnable2 m2 = new Myrunnable2();
    new Thread(m1).start();
    new Thread(m2).start();
    if(m1.singleton == m2.singleton){ //是同一个
      System.out.println("是同一个");
    }else{
      System.out.println("不是同一个");
    }
   }
}
  class Myrunnable implements Runnable{
    Nested singleton;
      @Override
      public void run() {
        // TODO Auto-generated method stub
        singleton = SingleTon3.getNested();
        SingleTon3.print();
      }
  }

  class Myrunnable2 implements Runnable{
    Nested singleton;
    @Override
    public void run() {
      // TODO Auto-generated method stub
      singleton = SingleTon3.getNested();
      SingleTon3.print();
    }
  }

输出:

是同一个

thread_id:11
thread_id:10

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

(0)

相关推荐

  • 单例模式垃圾回收_动力节点Java学院整理

    讨论命题:当一个单例的对象长久不用时,会不会被jvm的垃圾收集机制回收. 首先说一下为什么会产生这一疑问,笔者本人再此之前从来没有考虑过垃圾回收对单例模式的影响,直到去年读了一本书,<设计模式之禅>秦小波著.在书中提到在j2ee应用中,jvm垃圾回收机制会把长久不用的单例类对象当作垃圾,并在cpu空闲的时候对其进行回收.之前读过的几本设计模式的书,包括<Java与模式>,书中都没有提到jvm垃圾回收机制对单例的影响.并且在工作过程中,也没有过单例对象被回收的经历,加上工作中很多前辈

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

    单例模式应该是设计模式中比较简单的一个,也是非常常见的,但是在多线程并发的环境下使用却是不那么简单了,今天给大家分享一个我在开发过程中遇到的单例模式的应用. 首先我们先来看一下单例模式的定义: 一个类有且仅有一个实例,并且自行实例化向整个系统提供. 单例模式的要素: 1.私有的静态的实例对象 2.私有的构造函数(保证在该类外部,无法通过new的方式来创建对象实例) 3.公有的.静态的.访问该实例对象的方法 单例模式分为懒汉形和饿汉式 懒汉式: 应用刚启动的时候,并不创建实例,当外部调用该类的实例

  • Java实现单例模式之饿汉式、懒汉式、枚举式

    单例模式的实现(5种) 常用: 饿汉式(线程安全,调用效率高,但是不能延时加载) 懒汉式(线程安全,调用效率不高,可以延时加载) 其他: 双重检测锁式(由于jvm底层内部模型原因,偶尔会出问题,不建立使用) 静态内部类式(线程安全,调用效率高,但是可以延时加载) 枚举单例(线程安全,调用效率高,不能延时加载) 饿汉式单例具体代码如下: package com.lcx.mode; /** * * 饿汉式单例,不管以后用不用这个对象,我们一开始就创建这个对象的实例, * 需要的时候就返回已创建好的实

  • JAVA 枚举单例模式及源码分析的实例详解

    JAVA 枚举单例模式及源码分析的实例详解 单例模式的实现有很多种,网上也分析了如今实现单利模式最好用枚举,好处不外乎三点: 1.线程安全 2.不会因为序列化而产生新实例 3.防止反射攻击但是貌似没有一篇文章解释ENUM单例如何实现了上述三点,请高手解释一下这三点: 关于第一点线程安全,从反编译后的类源码中可以看出也是通过类加载机制保证的,应该是这样吧(解决) 关于第二点序列化问题,有一篇文章说枚举类自己实现了readResolve()方法,所以抗序列化,这个方法是当前类自己实现的(解决) 关于

  • java 单例模式和工厂模式实例详解

    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例. 私有的构造方法 指向自己实例的私有静态引用 以自己实例为返回值的静态的公有的方法 饿汉式单例 public class Singleton { private static Singleton singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){ return singleton; } } 懒

  • Java单例模式简单示例

    本文实例讲述了Java单例模式.分享给大家供大家参考,具体如下: 在实际开发的时候会有一些需求,在某个类中只能允许同时存在一个对象.这时就需要用到单例模式.代码如下 package org.aaa; public class ex { private static ex e; public static ex getEx() { if (e == null) { e=new ex(); } return e; } private ex() { System.out.println("执行单立模式

  • java 中单例模式饿汉式与懒汉式的对比

    java 中单例模式饿汉式与懒汉式的对比 概念: 保证一个类仅有一个实例,并提供一个访问它的全局访问点. 以前我们的做法是设置一个全局变量,也就是让它使得一个对象被访问.但是它不能防止你实例多个对象.这时我们可以让类自身负责保存它的唯一实例,这个类可以保证没有其他实例可以被创建,并且提供一个访问该实例的方法. 通过上面的描述,我们可以看到单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 因此,创建一个类的实例

  • Java 单例模式的实现资料整理

    Java单例模式的实现,对java 单例模式的几种实现方法进行了整理: 单例模式好多书上都是这么写的: public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return insta

  • Java 生成二维码的工具资料整理

    1.  使用SwetakeQRCode在Java项目中生成二维码 http://swetake.com/qr/ 下载地址 或着  http://sourceforge.jp/projects/qrcode/downloads/28391/qrcode.zip 这个是日本人写的,生成的是我们常见的方形的二维码 可以用中文 如:5677777ghjjjjj 有朋友问我要这个图片生成的代码,我就在网上搜索然后整理了一个类,首先要把SwetakeQRCode的jar包qrcode.jar放在工程的编译路

  • Java单例模式实现的几种方式

    Java单例模式实现的几种方式 单例模式好多书上都是这么写的: public class SingleTon1 { private SingleTon1(){ } private static SingleTon1 instance = null; public static SingleTon1 getInstance(){ if(instance == null){ instance = new SingleTon1(); } return instance; } } 但是实际开发中是不会这

  • java单例模式实现的方法

    1.最基本的单例模式 /** * @author LearnAndGet * @time 2018年11月13日 * 最基本的单例模式 */public class SingletonV1 { private static SingletonV1 instance = new SingletonV1();; //构造函数私有化 private SingletonV1() {} public static SingletonV1 getInstance() { return instance; }

  • 浅谈java 单例模式DCL的缺陷及单例的正确写法

    1 前言 单例模式是我们经常使用的一种模式,一般来说很多资料都建议我们写成如下的模式: /** * Created by qiyei2015 on 2017/5/13. */ public class Instance { private String str = ""; private int a = 0; private static Instance ins = null; /** * 构造方法私有化 */ private Instance(){ str = "hell

  • java 单例模式容易忽略的细节

    java单例模式 直接讲实现单例模式的两种方法:懒汉式和饿汉式,单例模式的概念自己上网搜吧这里就不讲了! 这里会涉及到java中的jvm,如果你没有这方面的知识,我建议你先去补补,不然会有点迷糊! 首先说说类什么时候进行加载? java虚拟机没有进行强制性的约束,但是对于初始化却严格规定了有且只有4种情况必须先对类进行初始化. 我们要知道的是在类加载的过程中,加载.验证.准备是在初始化之前完成的,所以进行了初始化,加载.验证.准备自然就在之前完成了. 然后这四种情况是分别遇到 new . get

  • 详解Java单例模式的实现与原理剖析

    目录 一.什么是单例模式 二.哪些地方用到了单例模式 三.单例模式的优缺点 优点 缺点 四.手写单例模式 饿汉式 枚举饿汉式 DCL懒汉式 双检锁懒汉式 内部类懒汉式 小结 一.什么是单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建.这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对

  • java单例模式实现面板切换

    本文实例为大家分享了java单例模式实现面板切换的具体代码,供大家参考,具体内容如下 1.首先介绍一下什么是单例模式: java单例模式是一种常见的设计模式,那么我们先看看懒汉模式: public class Singleton_ { //设为私有方法,防止被外部类引用或实例 private Singleton_(){ System.out.println("懒汉单例模式"); } private static Singleton_ single = null; //并对外只暴露get

  • Java中的循环笔记整理(必看篇)

    一.循环的类型: 1.for循环 class For{ public static void main(String[] args) { System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!"); System.out.println("Hello World!"); Sy

  • Java单例模式实现静态内部类方法示例

    Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式.接下来我们看看具体介绍. Singleton模式实现的重点在于将构造函数私有化(private),并通过提供静态公有函数(public synchronized static xxx getInstance)来获取定义在类中的静态私有成员(private static xxx instance),通过一个简单的判断静态实例是否为空来控制这个类只能够new一次,即控制了一个类只能有单个实例,一般的实现如下

随机推荐