参考网址如下:
http://xupo.iteye.com/blog/463426
http://www.iteye.com/topic/1121678?page=3
class="java">package com.lj.singleton2;
public class Singleton
{
private static Singleton st;
private static Singleton instance1 = new Singleton();
private static Singleton instance2;
private static Singleton instance3;
private Singleton()
{
}
// 懒汉式单例->当需要的时候,并且发现没有实例的时候,采取初始化
public static Singleton getInstance()
{
if (null == st)
{
threadSleep();
synchronized (Singleton.class)
{
//这里线程们会一个个执行st=new Singleton();然后返回,
//所以这个方法在多线程环境中没用。
st = new Singleton();
}
}
return st;
}
// 饿汉式单例->不管你需不需要,反正我是饿了,类加载的时候就已经
// 初始化,没有起到延迟加载的效果。
// 优点:这种方式最简单并且是线程安全的。
// 缺点:假如这个单例非常大, 在第一次类加载的时候可能会耗掉大量资源。
public static Singleton getInstance1()
{
return instance1;
}
// 对懒汉式进行同步,牺牲了性能,同步的原则应该是尽量对代码块同步,
// 不要对整个方法同步
public static synchronized Singleton getInstance2()
{
if (instance2 == null)
{
threadSleep();
instance2 = new Singleton();
}
return instance2;
}
// 双重检查加锁DCL(double checking lock),只在第一次调用
// getInstance()时才要同步,提高性能
public static Singleton getInstance3()
{
if (instance3 == null)
{
threadSleep();
synchronized (Singleton.class)
{
if (instance3 == null)
{
instance3 = new Singleton();
}
}
}
return instance3;
}
// 让当前线程休眠1秒,模拟多个线程同时访问instance
public static void threadSleep()
{
try
{
System.out.println("当前线程休眠1秒");
Thread.currentThread().sleep(1000);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
上面是实现单例的各种方法。
public class ThreadTest extends Thread
{
@Override
public void run()
{
Singleton s=Singleton.getInstance();
System.out.println(s.toString());
}
public static void main(String[] args)
{
Singleton s=Singleton.getInstance1();
for(int i=0;i<10;i++){
ThreadTest test=new ThreadTest();
test.start();
}
}
}
具体说明都在上面的链接中,非常详细。。