当前位置: 移动技术网 > IT编程>开发语言>Java > Java单例模式实现的几种方式

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

2019年07月22日  | 移动技术网IT编程  | 我要评论

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

以上就是对java 单例模式的资料整理,后续继续补充相关资料,谢谢大家对本站的支持!

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网