java单例代码 java中单例

如何在Java中实现单例模式?单例模式1:
public
class
singleton{
private
static
singleton
st
=
null;
private
singleton(){
}
public
static
singleton
getinstance(){
if(st
==
null){
st
=
new
singleton();
}
return
st;
}
}
单例模式2:
public
class
singleton{
private
static
singleton
st
=
new
singleton();
private
singleton(){
}
public
static
singleton
getinstance(){
return
st;
}
}
多线程1:
导入thread所在的包
public
class
mythread1
extends
thread{
public
void
run(){
xxxxx写自己的代码
}
}
多线程2
导入runnable所在的包
public
class
mythread2
implements
runnable{
public
void
run(){
xxxxx写自己的代码
}
}
另写一个测试类,在main方法中这样写:
thread
t
=
new
mythread1();
或者
runnable
r
=
new
mythread2();
thread
t
=
new
thread(r);
如何写一个标准的Java单例模式java中单例模式是一种常见的设计模式 , 单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种 。
单例模式有一下特点:
1、单例类只能有一个实例 。
2、单例类必须自己自己创建自己的唯一实例 。
3、单例类必须给所有其他对象提供这一实例 。
单例模式确保某个类只有一个实例 , 而且自行实例化并向整个系统提供这个实例 。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例 。这些应用都或多或少具有资源管理器的功能 。每台计算机可以有若干个打印机 , 但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中 。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口 , 以避免一个通信端口同时被两个请求同时调用 。总之 , 选择单例模式就是为了避免不一致状态,避免政出多头 。
首先看一个经典的单例实现 。
public class Singleton {
private static Singleton uniqueInstance = null;
private Singleton() {
// Exists only to defeat instantiation.
}
public static Singleton getInstance() {
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
return uniqueInstance;
}
// Other methods...
}
Singleton通过将构造方法限定为private避免了类在外部被实例化 , 在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问 。(事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效 。此问题在此处不做讨论,姑且掩耳盗铃地认为反射机制不存在 。)
但是以上实现没有考虑线程安全问题 。所谓线程安全是指:如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码 。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的 。或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题 。显然以上实现并不满足线程安全的要求 , 在并发环境下很可能出现多个Singleton实例 。

推荐阅读