单例代码写法java 单例代码实现

如何写一个标准的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实例 。
//////////////////////////////////////////////////////////////////////
验证单例模式的示例
//////////////////////////////////////////////////////////////////////
public class TestStream {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 该类只能有一个实例
private TestStream() {
} // 私有无参构造方法
// 该类必须自行创建
// 有2种方式
private static TestStream ts1 = null;
// 这个类必须自动向整个系统提供这个实例对象
public static TestStream getTest() {
if (ts1 == null) {
ts1 = new TestStream();
}
return ts1;
}
public void getInfo() {
System.out.println("output message "name);
}
public static void main(String[] args) {
TestStream s = TestStream.getTest();
s.setName("张孝祥 1");
System.out.println(s.getName());
TestStream s1 = TestStream.getTest();
s1.setName("张孝祥 2");
System.out.println(s1.getName());
s.getInfo();
s1.getInfo();
if (s == s1) {
System.out.println("创建的是同一个实例");
} else if (s != s1) {
System.out.println("创建的不是同一个实例");
} else {
System.out.println("application error");
}
}
}
////////////////////////////////////////////
如何写一个简单的单例模式?一、基本的实现思路:
单例的实现主要是通过以下两个步骤:
1、将该类的构造方法定义为私有方法 , 这样其他处的代码就无法通过调用该类的构造方法来实例化该类的对象,只有通过该类提供的静态方法来得到该类的唯一实例;
2、在该类内提供一个静态方法,当我们调用这个方法时,如果类持有的引用不为空就返回这个引用,如果类保持的引用为空就创建该类的实例并将实例的引用赋予该类保持的引用 。
二、示范如下:
1、枚举实现单例:
2、懒汉式线程不安全:
3、懒汉式线程安全:
4、饿汉式:
5、双重校验锁:
6、静态内部类:
扩展资料:
一、单列模式简介:
单例模式是设计模式中最简单的形式之一 。这一模式的目的是使得类的一个对象成为系统中的唯一实例 。要实现这一点,可以从客户端对其进行实例化开始 。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”所有想要生成对象的访问 。使用工厂方法来限制实例化过程 。这个方法应该是静态方法(类方法),因为让类的实例去生成另一个唯一实例毫无意义 。
二、懒汉与饿汉:
1、懒汉方式:指全局的单例实例在第一次被使用时构建 。
2、饿汉方式:指全局的单例实例在类装载时构建 。
三、单例模式的三要点:
1、某个类只能有一个实例 。
2、它必须自行创建这个实例 。
3、它必须自行向整个系统提供这个实例 。
四、优缺点:
1、优点:
①实例控制:单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例 。
②灵活性:因为类控制了实例化过程,所以类可以灵活更改实例化过程 。
2、缺点:
①开销:虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销 。可以通过使用静态初始化解决此问题 。
②可能的开发混淆:使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象 。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类 。
③对象生存期:不能解决删除单个对象的问题 。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用 。在某些语言中(如 C) , 其他类可以删除对象实例 , 但这样会导致单例类中出现悬浮引用 。
参考资料:百度百科单列模式
Java中单例模式有哪些实现方法单例模式大致有五种写法,分别为懒汉,恶汉,静态内部类 , 枚举和双重校验锁 。1、懒汉写法,常用写法 class LazySingleton{ private static LazySingleton singleton; private LazySingleton(){ } public static LazySingleton getInstance(){ i...
如何在Java中实现单例模式?单例模式1单例代码写法java:
public
class
singleton{
【单例代码写法java 单例代码实现】private
static
singleton
st
=
null;
private
singleton(){
}
public
static
singleton
getinstance(){
if(st
==
null){
st
=
new
singleton();
}
return
st;
}
}
单例模式2单例代码写法java:
public
class
singleton{
private
static
singleton
st
=
new
singleton();
private
singleton(){
}
public
static
singleton
getinstance(){
return
st;
}
}
多线程1单例代码写法java:
导入thread所在的包
public
class
mythread1
extends
thread{
public
void
run(){
xxxxx写自己的代码
}
}
多线程2
导入runnable所在的包
public
class
mythread2
implements
runnable{
public
void
run(){
xxxxx写自己的代码
}
}
另写一个测试类单例代码写法java,在main方法中这样写:
thread
t
=
new
mythread1();
或者
runnable
r
=
new
mythread2();
thread
t
=
new
thread(r);
java几种单例模式写法懒汉模式
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}public static SingletonDemo getInstance(){
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}}
2. 线程安全的懒汉模式
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo(){}
public static synchronized SingletonDemo getInstance(){
if(instance==null){
instance=new SingletonDemo();
}
return instance;
}}
3. 饿汉模式
public class SingletonDemo {
private static SingletonDemo instance=new SingletonDemo();
private SingletonDemo(){}
public static SingletonDemo getInstance(){
return instance;
}}
4. 静态类内部加载
public class SingletonDemo {
private static class SingletonHolder{
private static SingletonDemo instance=new SingletonDemo();
}
private SingletonDemo(){
System.out.println("Singleton has loaded");
}
public static SingletonDemo getInstance(){
return SingletonHolder.instance;
}}
5.双重校验锁法
public class SingletonDemo {
private volatile static SingletonDemo instance;
private SingletonDemo(){
System.out.println("Singleton has loaded");
}
public static SingletonDemo getInstance(){
if(instance==null){
synchronized (SingletonDemo.class){
if(instance==null){
instance=new SingletonDemo();
}}}
return instance;
}}
关于单例代码写法java和单例代码实现的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读