public class SynSingletion {
public static void main(String[] args){
ThreadInstance ti=new ThreadInstance(); //使用时创建单列模式
Thread t1=new Thread(ti);
Thread t2=new Thread(ti);
t1.start(); //使该线程开始执行;Java 虚拟机调用该线程的 run 方法。
t2.start(); //虚拟机内部是怎么实现自动调用run()方法的,我们不用管。
try {
Thread.sleep(5000); //放大错误,时间越大捕获错误准确率越高,防止CPU没有执行完其它线程
System.out.println("如果出现数字是2证明我已经被第一个线程创建的对象覆盖:"+InstanceOnly.getFlag());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//由于是多线程,线程并行运行,所以可能会创建多个对象,
//后来创建的对象会覆盖之前的对象,达不到单列模式效果
class ThreadInstance implements Runnable{
private int i=0;
public void run(){
i++;
InstanceOnly.getInstance(i); //创建单列对象
}
}
//下面是单列模板,没有使用线程同步锁定
class InstanceOnly {
private static int flag=0; //标记,记录是不是创建了2个对象
private static InstanceOnly instance;
private InstanceOnly(){ //私有化构造函数,不被外界初始化
}
public static InstanceOnly getInstance(int flag){
// synchronized(InstanceOnly.class){ //类名.class为对象的模板
if(null==instance){
InstanceOnly.setFlag(flag);
System.out.println("创建:"+(instance=new InstanceOnly()).toString());
}
// }
return instance;
}
public static int getFlag() {
return flag;
}
public static void setFlag(int flag) {
InstanceOnly.flag = flag;
}
}
--------------------------------------------以上是JAVA多线程创建单列模式与同步的演示代码,
---------------------------------------------目的:提供最大直观性参考。加强逻辑思维。