import java.util.*;
import java.lang.*;
import java.io.*;

class Ideone {

public static void main (String[] args) throws java.lang.Exception {

 long st, en;
 st = System.nanoTime();
 for(int i = 1; i < 100000; i++){
  Singleton s=Singleton.getInstance();
 }
 en = System.nanoTime();
 System.out.println("One:" + (en - st)/1000000.d + " msc");
//------

 st = System.nanoTime();
 for(int i = 1; i < 100000; i++){
  Singleton2 s=Singleton2.getInstance();
 }
 en = System.nanoTime();
System.out.println("Two:" + (en - st)/1000000.d + " msc");
//------

 SingletonBulder sb=new SingletonBulder();
 Singleton s0=sb.getInstance();

 st = System.nanoTime();
 for(int i = 1; i < 100000; i++){
  Singleton s=sb.getInstance();
 }
 en = System.nanoTime();
System.out.println("SB:" + (en - st)/1000000.d + " msc");
 }
}

class Singleton {
private static volatile Singleton instance;

 public static Singleton getInstance() {
  if (instance == null) {
   synchronized (Singleton.class) {
    if (instance == null) {
    instance = new Singleton();
    }
   }
  }
 return instance;
 }
}

class Singleton2 {
private static volatile Singleton2 instance2;
 
 private static Singleton2 getInstance2() {
  if (instance2 == null) {
   synchronized(Singleton2.class) {
    if (instance2 == null) {
     instance2 = new Singleton2();
    }
   }
  }
  return instance2;
 }

 private static Singleton2 instance;

 public static Singleton2 getInstance() {
  if (instance == null) {
   instance = getInstance2();
  }
  return instance;
 }
}

class SingletonBulder {
 private static Singleton instance;
 private static SingletonBulder.SB sb;
 public SingletonBulder(){
  sb=new SB();
 }
 public Singleton getInstance() {
  return sb.getInstance();
 }
 private class SB{
  public Singleton getInstance() {
   instance=Singleton.getInstance();
   sb=new SB(){
    public Singleton getInstance(){
     return instance;
    }
   };
   return instance;
  }
 }
}