//// Thread-safe Singleton with Double-Checked Locking
class singleton{
private static volatile singleton instance;
private singleton(){
System.
out.
println("singleton instance is created"); }
public static singleton getInstance(){
if(instance==null)
{
synchronized(singleton.class){
if(instance==null)
{
instance = new singleton();
}
}
}
return instance;
}
void method()
{
System.
out.
println("Hello from Singleton!"); }
}
public class Main{
public static void main
(String[] args
) {
singleton obj1 = singleton.getInstance();
singleton obj2 = singleton.getInstance();
obj1.method();
if(obj1==obj2)
{
System.
out.
println("Both references point to the same instance!"); }
}
}
Ly8vLyBUaHJlYWQtc2FmZSBTaW5nbGV0b24gd2l0aCBEb3VibGUtQ2hlY2tlZCBMb2NraW5nCmNsYXNzIHNpbmdsZXRvbnsKICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIHNpbmdsZXRvbiBpbnN0YW5jZTsKICAgIHByaXZhdGUgc2luZ2xldG9uKCl7CiAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzaW5nbGV0b24gaW5zdGFuY2UgaXMgY3JlYXRlZCIpOwogICAgfQogICAgcHVibGljIHN0YXRpYyBzaW5nbGV0b24gZ2V0SW5zdGFuY2UoKXsKICAgICAgICBpZihpbnN0YW5jZT09bnVsbCkKICAgICAgICB7CiAgICAgICAgICAgIHN5bmNocm9uaXplZChzaW5nbGV0b24uY2xhc3MpewogICAgICAgICAgICAgICAgaWYoaW5zdGFuY2U9PW51bGwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgc2luZ2xldG9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgfQogICAgdm9pZCBtZXRob2QoKQogICAgewogICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSGVsbG8gZnJvbSBTaW5nbGV0b24hIik7CiAgICB9Cn0KCnB1YmxpYyBjbGFzcyBNYWluewogICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKICAgIHsKICAgICAgICBzaW5nbGV0b24gb2JqMSA9IHNpbmdsZXRvbi5nZXRJbnN0YW5jZSgpOwogICAgICAgIHNpbmdsZXRvbiBvYmoyID0gc2luZ2xldG9uLmdldEluc3RhbmNlKCk7CiAgICAgICAgCiAgICAgICAgb2JqMS5tZXRob2QoKTsKICAgICAgICAKICAgICAgICBpZihvYmoxPT1vYmoyKQogICAgICAgIHsKICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJCb3RoIHJlZmVyZW5jZXMgcG9pbnQgdG8gdGhlIHNhbWUgaW5zdGFuY2UhIik7CiAgICAgICAgfQogICAgfQp9