示例代码:
1、定义单例类
package sigle;
//懒汉式单例类.在第一次调用的时候实例化
public class Singleton {
//私有的默认构造子
private Singleton()
{
//初始化标识位
setFlag(true);
}
//注意,这里没有final
private static Singleton single=null;
//静态工厂方法
public synchronized static Singleton getInstance() {
if (single == null) {
single = new Singleton();
}
return single;
}
//标识方法是否在调用中 true为调用中,false标识调用完毕
private static boolean Flag;
//演示方法调用
public void Print() {
setFlag(false);
System.out.print("准备运行--》\n");
try {
for (int i = 0; i < 5; i++) {
System.out.print("运行中。。。。。\n");
Thread.sleep(1000);
}
} catch (Exception e) {
}
System.out.print("运行完毕--》\n");
//设置标识值为true
setFlag(true);
}
public static boolean getFlag() {
return Flag;
}
private void setFlag(boolean flag) {
Flag = flag;
}
}
2、调用此方法的类
package sigle;
public class Run extends Thread{
Singleton s2;
public Run() {
s2=Singleton.getInstance();
}
public void run(){
//循环判断
while (true) {
if (Singleton.getFlag()) {
s2.Print();
break;//执行完毕退出循环
}else {
try {
System.out.print(this.getName()+"在等待。。\n");
Thread.sleep(1000);
} catch (Exception e) {
}
}
}
}
}
3、多线程并发调用
package sigle;
public class MyRun {
/**
* @param args
*/
public static void main(String[] args) {
Run r1=new Run();
Run r2=new Run();
Run r3=new Run();
r1.setName("线程1号");
r2.setName("线程2号");
r3.setName("线程3号");
r1.start();
r2.start();
r3.start();
}
}
4、执行结果,验证print方法同时只被1个线程调用执行
准备运行--》
线程2号在等待。。
线程3号在等待。。
运行中。。。。。
运行中。。。。。
线程2号在等待。。
线程3号在等待。。
运行中。。。。。
线程2号在等待。。
线程3号在等待。。
线程3号在等待。。
线程2号在等待。。
运行中。。。。。
运行中。。。。。
线程3号在等待。。
线程2号在等待。。
运行完毕--》
准备运行--》
运行中。。。。。
线程3号在等待。。
运行中。。。。。
线程3号在等待。。
运行中。。。。。
线程3号在等待。。
线程3号在等待。。
运行中。。。。。
运行中。。。。。
线程3号在等待。。
运行完毕--》
线程3号在等待。。
准备运行--》
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行中。。。。。
运行完毕--》