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.




/* NetRexx */
options replace format comments java crossref symbols binary
 
import java.util.random
 
class RCSingleton public
 
  method main(args = String[]) public static
    RCSingleton.Testcase.main(args)
    return
 
  -- ---------------------------------------------------------------------------
  class RCSingleton.Instance public
 
    properties private static
      _instance = Instance()
 
    properties private
      _refCount = int
      _random   = Random
 
    method Instance() private
      this._refCount = 0
      this._random = Random()
      return
 
    method getInstance public static returns RCSingleton.Instance
      return _instance
 
  method getRandom public returns Random
    return _random
 
    method addRef public protect
      _refCount = _refCount + 1
      return
 
    method release public protect
      if _refCount > 0 then
        _refCount = _refCount - 1
      return
 
    method getRefCount public protect returns int
      return _refCount
 
  -- ---------------------------------------------------------------------------
  class RCSingleton.Testcase public implements Runnable
 
  properties private
    _instance = RCSingleton.Instance
 
  method run public
    say threadInfo'|-'
    thud = Thread.currentThread
    _instance = RCSingleton.Instance.getInstance
    thud.yield
    _instance.addRef
    say threadInfo'|'_instance.getRefCount
    thud.yield
    do
      thud.sleep(_instance.getRandom.nextInt(1000))
    catch ex = InterruptedException
      ex.printStackTrace
      end
    _instance.release
    say threadInfo'|'_instance.getRefCount
    return
 
  method main(args = String[]) public static
    threads = [ Thread -
      Thread(Testcase()), Thread(Testcase()), Thread(Testcase()), -
      Thread(Testcase()), Thread(Testcase()), Thread(Testcase()) ]
    say threadInfo'|-'
    mn = Testcase()
    mn._instance = RCSingleton.Instance.getInstance
    say mn.threadInfo'|'mn._instance.getRefCount
    mn._instance.addRef
    say mn.threadInfo'|'mn._instance.getRefCount
    do
      loop tr over threads
        (Thread tr).start
        end tr
      Thread.sleep(400)
    catch ex = InterruptedException
      ex.printStackTrace
      end
    mn._instance.release
    say mn.threadInfo'|'mn._instance.getRefCount
    return
 
  method threadInfo public static returns String
    trd = Thread.currentThread
    tid = trd.getId
    hc  = trd.hashCode
    info = Rexx(trd.getName).left(16, '_')':' -
        || Rexx(Long.toString(tid)).right(10, 0)':' -
        || '@'Rexx(Integer.toHexString(hc)).right(8, 0)
    return info
 
 