Java 단일 모드 구현 자료 정리

4025 단어 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();
  }
}
다음은 단례를 만드는 데 자주 사용되는 패턴입니다.
테스트 코드:


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
읽어주셔서 감사합니다. 여러분에게 도움이 되었으면 좋겠습니다. 본 사이트에 대한 지지에 감사드립니다!

좋은 웹페이지 즐겨찾기