A Global Singleton is a class of which only one instance exists within a program.

Any attempt to use non-static members of the class involves performing operations on this one instance.




module singleton ;
import std.stdio ;
import std.thread ;
import std.random ;
import std.c.time ;
 
class Dealer {
  private static Dealer me ;
  static Dealer Instance() {
    writefln("   Calling Dealer... ") ;
    if(me is null) // Double Checked Lock
      synchronized  // this part of code can only be executed by one thread a time
        if(me is null) 
          me = new Dealer ;     
    return me ;
  }
  private static string[] str = ["(1)Enjoy", "(2)Rosetta", "(3)Code"] ;
  private int state ;
  private this() { 
    for(int i = 0 ; i < 3 ; i++) { 
      writefln("...calling Dealer... ") ;
      msleep(rand() & 2047) ;
    }
    writefln(">>Dealer is called to come in!") ;
    state = str.length - 1 ;
  }
  Dealer nextState() {
    synchronized(this) // accessed to Object _this_ is locked ... is it necessary ???
      state = (state + 1) % str.length ;
    return this ;
  }
  string toString() { return str[state] ; }   
}
 
class Coder : Thread {
  private string name_ ;
  Coder hasName(string name) {  name_ = name ; return this ; }
  override int run() {
    msleep(rand() & 1023) ;
    writefln(">>%s come in.", name_) ;
    Dealer single = Dealer.Instance ;
    msleep(rand() & 1023) ;
    for(int i = 0 ; i < 3 ; i++) {
      writefln("%9s got %-s", name_, single.nextState) ;
      msleep(rand() & 1023) ;
    }
    return 0 ;
  }
}
 
void main() { 
  Coder x = new Coder ; 
  Coder y = new Coder ; 
  Coder z = new Coder ; 
 
  x.hasName("Peter").start() ;
  y.hasName("Paul").start() ;
  z.hasName("Mary").start() ; 
 
  x.wait ;  y.wait ;  z.wait ;  
}