java常用的几种单例模式(懒汉式,饿汉式单件模式用途:
单件模式属于工厂模式java恶汉模式代码的特例java恶汉模式代码,只是它不需要输入参数并且始终返回同一对象的引用 。
单件模式能够保证某一类型对象在系统中的唯一性java恶汉模式代码,即某类在系统中只有一个实例 。它的用途十分广泛 , 打个比方,java恶汉模式代码我们开发了一个简单的留言板,用户的每一次留言都要将留言信息写入到数据库中,最直观的方法是没次写入都建立一个数据库的链接 。这是个简单的方法 , 在不考虑并发的时候这也是个不错的选择 。但实际上,一个网站是并发的 , 并且有可能是存在大量并发操作的 。如果java恶汉模式代码我们对每次写入都创建一个数据库连接 , 那么很容易的系统会出现瓶颈,系统的精力将会很多的放在维护链接上而非直接查询操作上 。这显然是不可取的 。
如果我们能够保证系统中自始至终只有唯一一个数据库连接对象,显然我们会节省很多内存开销和cpu利用率 。这就是单件模式的用途 。当然单件模式不仅仅只用于这样的情况 。在《设计模式:可复用面向对象软件的基础》一书中对单件模式的适用性有如下描述:
1、当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时 。
2、当这个唯一实例应该是通过子类化可扩展的 , 并且客户应该无需更改代码就能使用一个扩展的实例时 。
下面对单件模式的懒汉式与饿汉式进行简单介绍:
1、饿汉式:在程序启动或单件模式类被加载的时候,单件模式实例就已经被创建 。
2、懒汉式:当程序第一次访问单件模式实例时才进行创建 。
如何选择:如果单件模式实例在系统中经常会被用到,饿汉式是一个不错的选择 。
java饿汉式单例设计模式因为是静态变量 static Single s 所以类加载即被创建该变量s指向new Single(),当调用getInstance时返回s对象 。
因为该s对象属于静态成员变量存在方法区而不是在堆栈中 。方法区存储的东西只有一份 。所以即使String b=Single.getInstance().返回的仍然是方法区中的唯一的静态变量s 。即单例模式只有一个静态变量s指向该对象 。不管怎么调用都只有一个该对象 。
急求java设计模式,要求用到两种设计模式 求详细代码.饿汉式单例类
//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {
//私有的默认构造子
private Singleton1() {}
//已经自行实例化
private static final Singleton1 single = new Singleton1();
//静态工厂方法
public static Singleton1 getInstance() {
return single;
}
}
2.懒汉式单例类
//懒汉式单例类.在第一次调用的时候实例化
public class Singleton2 {
//私有的默认构造子
private Singleton2() {}
//注意 , 这里没有final
private static Singleton2 single=null;
//静态工厂方法
public synchronizedstatic Singleton2 getInstance() {
if (single == null) {
single = new Singleton2();
}
return single;
}
}
//对懒汉式单例的改进(错误的改进)
//实际上,只有在第一次创建对象的时候需要加锁 , 之后就不需要了,这样可以提升性能
public synchronizedstatic Singleton2 getInstance() {
if (instance == null) {
synchronized(instance){ //锁住当前实例对象
if(instance == null){
instance = new Singleton2();
}
}
}
return instance;
}
错误原因:
aA、B线程同时进入了第一个if判断
bA首先进入synchronized块 , 由于instance为null,所以它执行instance = new Singleton();
c由于JVM内部的优化机制 , JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块 。
dB进入synchronized块,由于instance此时不是null , 因此它马上离开了synchronized块并将结果返回给调用该方法的程序 。
e此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了 。
正确改进(使用内部类):
JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,JVM能够帮我们保证instance只被创建一次,
并且会保证把赋值给instance的内存初始化完毕 , 这样我们就不用担心上面的问题 。
同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题
public?class?Singleton?{??
??
/*?私有构造方法,防止被实例化?*/??
private?Singleton(){
}
/*?此处使用一个内部类来维护单例?*/??
private?static?class?SingletonFactory?{??
private?static?Singleton?instance?=?new?Singleton();??
}
/*?获取实例?*/??
public?static?Singleton?getInstance()?{??
return?SingletonFactory.instance;??
}
/*?如果该对象被用于序列化,可以保证对象在序列化前后保持一致?*/??
public?Object?readResolve()?{??
return?getInstance();??
}
}
其实说它完美 , 也不一定,如果在构造函数中抛出异常,实例将永远得不到创建,也会出错????
第二种改进:
因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,
单独为创建加synchronized关键字,也是可以的
public class Singleton{
private static Singletoninstance=null;
private Singleton(){}
privatestatic synchronized void Init(){
if(instance==null)
instance=new Singletion();
}
public static Singleton getInstance(){
if(instance==null){
Init();
}
return instance;
}
}
3.登记式单例类
import java.util.HashMap;
import java.util.Map;
//登记式单例类.
//类似Spring里面的方法,将类名注册,下次从里面直接获取 。
public class Singleton3 {
private static MapString,Singleton3 map = new HashMapString,Singleton3();
static{
Singleton3 single = new Singleton3();
map.put(single.getClass().getName(), single);
}
//保护的默认构造子
protected Singleton3(){}
//静态工厂方法,返还此类惟一的实例
public static Singleton3 getInstance(String name) {
if(name == null) {
name = Singleton3.class.getName();
System.out.println("name == null" "---name=" name);
}
if(map.get(name) == null) {
try {
map.put(name, (Singleton3) Class.forName(name).newInstance());
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
return map.get(name);
}
//一个示意性的商业方法
public String about() {
return "Hello, I am RegSingleton.";
}
public static void main(String[] args) {
Singleton3 single3 = Singleton3.getInstance(null);
System.out.println(single3.about());
}
}
手写单例模式(饿汉和饱汉模式)和工厂模式 (1)单例饿汉模式://饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1
{//私有的默认构造子
private Singleton1() {}//已经自行实例化
private static final Singleton1 single = new Singleton1();//静态工厂方法
public static Singleton1 getInstance() { return single;} }
(2)懒汉模式://懒汉式单例类.在第一次调用的时候实例化
Java初高级一起学习分享,共同学习才是最明智的选择,喜欢的话可以我的学习群64弍46衣3凌9,或加资料群69似64陆0吧3(进群备注平台名)
public class Singleton2
{//私有的默认构造子
private Singleton2() {}//注意,这里没有final
private static Singleton2 single=null;//静态工厂方法
public synchronized static Singleton2 getInstance() {if (single == null) { single = new Singleton2();}return single;}}
(3)工厂模式:
interface IFactory{ public IProduct createProduct();}
Class Factory implements IFactory{ public IProduct createProduct(){return new Product();}}
Public class client
{ Public Static void main (String [] args)
{IFactory factory=new Factory(); IProduct product=factory.createProduct(); product.ProductMethod();}}
Java单例模式饿汉式会有线程安全问题吗标准的答案!饿汉式没有线程安全问题,懒汉式需要双重锁定解决可能的线程安全问题 。
饿汉式的缺点是类一加载就实例化,提前占用系统资源
关于JAVA中的singleton模式package test;
public class Singleton {
private Singleton s;
private Singleton()
{
}
public static Singleton getSigleton()
{
if(s==null)s=new Singleton();
return s;
}
}
这就是一个单例模式,我想应该不用注释了,原理就是这个类的构造方法private了,所有在外边不能调用,也就不能new Singleton();得到实例,那么
想得到实例就得调用它的静态方法getSigleton();即Singleton.getSigleton();就会返回一个Singleton的实例 , 注意此方法中的语句,即如果你是第一次调用这个方法那么它会给你new一个实例 , 以后再调用得到的都是这个实例,也就是说从始至终就只有一个Singleton的实例,这就是单例模式 。
【java恶汉模式代码 java饿汉式】关于java恶汉模式代码和java饿汉式的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 战争模拟器游戏攻城,战争模拟器战役
- redis计算经纬度距离,java计算经纬度距离
- linux命令ui,linux命令uname
- 快手直播名人,快手直播名人排行榜
- c语言map函数例子 map函数的用法
- 如何投诉虚假营销,如何投诉虚假广告并获得赔偿
- cpu有什么提升,提高cpu的个数有什么用
- 直播页面互动素材图片,直播页面互动素材图片下载
- linux时间命令设置 linux时间设置时间