- 浏览: 205859 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
zhangyanqiu:
能具体的说明一下,例如几个例子么???
实现数据库兼容并不象你想象的那么难 -
lzy.je:
DCL成熟的
对于单例模式的一点想法 -
okhaoba:
我觉得懒汉模式,即第一种足矣。
对于单例模式的一点想法 -
insiku:
想不到javaeye上 不看清楚就乱回帖的人也这么多
对于单例模式的一点想法 -
icewubin:
还在讨论synchronized?第二页buaawhl 说的那 ...
对于单例模式的一点想法
单例模式很普遍,对于Spring的实现机制不清楚,单就Java语言上的实现机制来讨论。
虽然简单,但要获得一个高性能且线程安全的单例确不简单。
最简单的、成熟的单例实现有如下两种:
1.
即在声明静态变量时就实例化。这种方法的问题是,不能传入构造参数从而动态的创建实例。
2.
即在方法上同步。这种方法的问题是,始终有同步的开销(虽然对很多应用来说这开销并不大,以致不需要考虑),而更理想的情况是,读操作不需要同步,只在创建实例时同步。
看上去更好的方法(但有问题!)是:
Double-checked synchronization,
如:
问题解释如下:
参考1:http://www.ibm.com/developerworks/java/library/j-dcl.html
参考2:http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
在参考1中提到,out-of-order writes是原因,就是说INSTANCE=new Singleton();这行代码并不是一定按如下伪代码顺序进行的:
1.分配内存
2.调用构造器
3.赋值给INSTANCE
在有的JIT上会编译优化为:
1.分配内存
2.赋值给INSTANCE
3.调用构造器
这就是所谓的out-of-order writes。则问题会出在第2步:此时判断(INSTANCE==null)已经返回真了,但构造器还未调用完成,此时访问INSTANCE则会出现不可预料的问题。
以上都是简单的重复广为人知的知识,下面是我的补充:
在参考2中的"It will work for 32-bit primitive values"一节给了我启发,它提到对32位的原始类型的Double-checked locking是可以的,(我认为实际关键点在于
赋值操作是否是原子的)。既然对int的赋值是原子的,我们可以稍加改进,引入一个int hasInitialized:
区别在于:
以hasInitialized==0来判断是否初始化完成,而在NSTANCE=new Singleton();之后才赋值以确认初始化完成。
这样不是既可保持高性能(绝大部分情况下没有锁,不进入需同步的块)、又可保证线程安全么?
分布式应用中,单例干脆就别用了,即使用了也就是节省点内存的用途了。
static final会直接编译成常量,也就是Test1中的Single.NAME其实是直接初始化成常量,并没有调用到Singleton。看看这个帖子 http://www.iteye.com/topic/211937
但是
这种模式的话,对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化,但是此时根本不需要初始化。
你这种说法不知道有什么证据?
我以前也和你一样,想当然这样认为“对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化”,但我做了个小实验,SUN JDK1.6下(JDK1.5一样):
执行结果如下:
说明调用Singleton.NAME常量是不会触发此类其他静态变量的初始化的,(即单例也不会被初始化)。
调用静态方法则会。
试试这样
Singleton的应用比较狭窄,如果出现如上场景,Singleton多半就是反模式,还不如不用,一般也就是放些不重要的,或者明显无状态的功能。
c#的msdn上面是这种方法.java上面的机制应该也是可以的.虽然static属性是第一次使用类的时候初始化,但是这种子class的应该是第一次使用这个子的class的时候才进行初始化的吧.
还有那个使用0,1来进行二次检测的方法.我觉得应该是可行的.使用元数据类型的话不存在创建时间之类的问题.true,false应该也是可行的.
不知道反对的人具体的什么原因呢?
我觉得这种方法跟我提到的第一种方法没有什么区别,就是
你是不是说这种方法不是lazy init的?但我试验的结果就是laze的。
即static变量不是在class加载的时候初始化的,而是在实例化此类第一个实例的时候初始化的。
不知道这是不是JVM的标准行为。
lazy只是个说法,lazy的程度是不一样的。
举例如下:
IODH模式下,只有在调用getInstance()的时候才会发生初始化。
但是
这种模式的话,对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化,但是此时根本不需要初始化。
我觉得这种方法跟我提到的第一种方法没有什么区别,就是
你是不是说这种方法不是lazy init的?但我试验的结果就是laze的。
即static变量不是在class加载的时候初始化的,而是在实例化此类第一个实例的时候初始化的。
不知道这是不是JVM的标准行为。
你没有仔细研究第一个方法为什么有问题,及第二种方法为什么解决了它的问题,当然会觉得差不多了。
我最后提出的一种方案不行么?
JVM 不保证代码INSTANCE=new Singleton() 一定在hasInitialized=1之前执行!!!
这个不会吧?你的证据呢?
我提到的out-of-order write只是对INSTANCE=new Singleton()范围而言。
连两条语句的顺序都无法保证,这个就难以想象了。。。
谢谢提醒,我已经修改了,笔误。
虽然简单,但要获得一个高性能且线程安全的单例确不简单。
最简单的、成熟的单例实现有如下两种:
1.
public static final Singleton INSTANCE=new Singleton();
即在声明静态变量时就实例化。这种方法的问题是,不能传入构造参数从而动态的创建实例。
2.
public static synchronized Singleton getInstance(){...}
即在方法上同步。这种方法的问题是,始终有同步的开销(虽然对很多应用来说这开销并不大,以致不需要考虑),而更理想的情况是,读操作不需要同步,只在创建实例时同步。
看上去更好的方法(但有问题!)是:
Double-checked synchronization,
如:
private static Singleton INSTANCE; public static Singleton getInstance(){ if(INSTANCE==null){ synchronized(Singelton.class){ //Double checking if(INSTANCE==null){ INSTANCE=new Singleton(); } } } }
问题解释如下:
参考1:http://www.ibm.com/developerworks/java/library/j-dcl.html
参考2:http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html
在参考1中提到,out-of-order writes是原因,就是说INSTANCE=new Singleton();这行代码并不是一定按如下伪代码顺序进行的:
1.分配内存
2.调用构造器
3.赋值给INSTANCE
在有的JIT上会编译优化为:
1.分配内存
2.赋值给INSTANCE
3.调用构造器
这就是所谓的out-of-order writes。则问题会出在第2步:此时判断(INSTANCE==null)已经返回真了,但构造器还未调用完成,此时访问INSTANCE则会出现不可预料的问题。
以上都是简单的重复广为人知的知识,下面是我的补充:
在参考2中的"It will work for 32-bit primitive values"一节给了我启发,它提到对32位的原始类型的Double-checked locking是可以的,(我认为实际关键点在于
赋值操作是否是原子的)。既然对int的赋值是原子的,我们可以稍加改进,引入一个int hasInitialized:
private static int hasInitialized=0; private static Singleton INSTANCE; public static Singleton getInstance(){ if(hasInitialized==0){ synchronized(Singelton.class){ //Double checking if(hasInitialized==0){ INSTANCE=new Singleton(); hasInitialized=1; } } } }
区别在于:
以hasInitialized==0来判断是否初始化完成,而在NSTANCE=new Singleton();之后才赋值以确认初始化完成。
这样不是既可保持高性能(绝大部分情况下没有锁,不进入需同步的块)、又可保证线程安全么?
评论
23 楼
icewubin
2008-07-08
lt0604 写道
单例在分布式应用中应该特别注意!
分布式应用中,单例干脆就别用了,即使用了也就是节省点内存的用途了。
22 楼
dennis_zane
2008-07-07
Lucas Lee 写道
你这种说法不知道有什么证据?
我以前也和你一样,想当然这样认为“对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化”,但我做了个小实验,SUN JDK1.6下(JDK1.5一样):
执行结果如下:
说明调用Singleton.NAME常量是不会触发此类其他静态变量的初始化的,(即单例也不会被初始化)。
调用静态方法则会。
我以前也和你一样,想当然这样认为“对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化”,但我做了个小实验,SUN JDK1.6下(JDK1.5一样):
package test; public class Singleton { public static final String NAME = "test"; private static final Singleton INSTANCE = new Singleton(); private Singleton() { System.out.println("Invoke constructor."); } public static Singleton getInstance() { return INSTANCE; } }
package test; public class Test1 { public static void main(String[] args) throws Exception { System.out.println(Singleton.NAME); System.out.println("-------------------"); Singleton.printString("Test static method."); } }
执行结果如下:
test ------------------- Invoke constructor. Test static method.
说明调用Singleton.NAME常量是不会触发此类其他静态变量的初始化的,(即单例也不会被初始化)。
调用静态方法则会。
static final会直接编译成常量,也就是Test1中的Single.NAME其实是直接初始化成常量,并没有调用到Singleton。看看这个帖子 http://www.iteye.com/topic/211937
21 楼
LucasLee
2008-07-07
icewubin 写道
但是
public static final Singleton INSTANCE=new Singleton();
这种模式的话,对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化,但是此时根本不需要初始化。
你这种说法不知道有什么证据?
我以前也和你一样,想当然这样认为“对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化”,但我做了个小实验,SUN JDK1.6下(JDK1.5一样):
package test; public class Singleton { public static final String NAME = "test"; private static final Singleton INSTANCE = new Singleton(); private Singleton() { System.out.println("Invoke constructor."); } public static Singleton getInstance() { return INSTANCE; } }
package test; public class Test1 { public static void main(String[] args) throws Exception { System.out.println(Singleton.NAME); System.out.println("-------------------"); Singleton.printString("Test static method."); } }
执行结果如下:
test ------------------- Invoke constructor. Test static method.
说明调用Singleton.NAME常量是不会触发此类其他静态变量的初始化的,(即单例也不会被初始化)。
调用静态方法则会。
20 楼
netrice
2008-07-07
public static SysRoleDAO getInstance() { if (sysRole == null) { synchronized (SysRoleDAO.class) { if (sysRole == null) { SysRoleDAO _sysRole = new SysRoleDAO(); sysRole = _sysRole; } } } return sysRole; }
试试这样
19 楼
lt0604
2008-07-07
单例在分布式应用中应该特别注意!
18 楼
edwardpro
2008-07-07
synchronized 的确实一种落后的声明了...
17 楼
icewubin
2008-07-06
Mozart 写道
Initialization on Demand Holder 好像是较早google的BOB提出的,也就是Guice的作者。其实Singleton说开了有很多可能导致意外多实例的情况。不同的VM,分布式应用比如EJB,RMI里面都可能出现假Singleton,不同的Class loader,比如applet在加载不同地址代码的时候可能发生意外,还有同步控制错误等。要防范所有的情况还真比较困难,个人看法最好还是让Singleton stateless,只负责对资源的存取,以策万全。
因为既便是很好防止了上面提到的种种可能,GC也可能制造一些麻烦(以为没人用就回收了,后来发现又有人要,只得重新创建一个Singleton,有状态也变没状态了)
因为既便是很好防止了上面提到的种种可能,GC也可能制造一些麻烦(以为没人用就回收了,后来发现又有人要,只得重新创建一个Singleton,有状态也变没状态了)
Singleton的应用比较狭窄,如果出现如上场景,Singleton多半就是反模式,还不如不用,一般也就是放些不重要的,或者明显无状态的功能。
16 楼
香克斯
2008-07-06
buaawhl 写道
以前有人讨论过。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
public class Singleton { static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
c#的msdn上面是这种方法.java上面的机制应该也是可以的.虽然static属性是第一次使用类的时候初始化,但是这种子class的应该是第一次使用这个子的class的时候才进行初始化的吧.
还有那个使用0,1来进行二次检测的方法.我觉得应该是可行的.使用元数据类型的话不存在创建时间之类的问题.true,false应该也是可行的.
不知道反对的人具体的什么原因呢?
15 楼
ln1058
2008-07-06
是不是考虑一下用ThreadLocal会更好呢,虽然不是单例模式
14 楼
spiritfrog
2008-07-06
这贴为什么给新手帖这么多?
难道都理解了?
ibm这篇http://www.ibm.com/developerworks/java/library/j-dcl.html
out-of-order writes往后,就很难看下去了。
难道都理解了?
ibm这篇http://www.ibm.com/developerworks/java/library/j-dcl.html
out-of-order writes往后,就很难看下去了。
13 楼
Mozart
2008-07-06
Initialization on Demand Holder 好像是较早google的BOB提出的,也就是Guice的作者。其实Singleton说开了有很多可能导致意外多实例的情况。不同的VM,分布式应用比如EJB,RMI里面都可能出现假Singleton,不同的Class loader,比如applet在加载不同地址代码的时候可能发生意外,还有同步控制错误等。要防范所有的情况还真比较困难,个人看法最好还是让Singleton stateless,只负责对资源的存取,以策万全。
因为既便是很好防止了上面提到的种种可能,GC也可能制造一些麻烦(以为没人用就回收了,后来发现又有人要,只得重新创建一个Singleton,有状态也变没状态了)
因为既便是很好防止了上面提到的种种可能,GC也可能制造一些麻烦(以为没人用就回收了,后来发现又有人要,只得重新创建一个Singleton,有状态也变没状态了)
12 楼
icewubin
2008-07-06
Lucas Lee 写道
buaawhl 写道
以前有人讨论过。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
public class Singleton { static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
我觉得这种方法跟我提到的第一种方法没有什么区别,就是
public static final Singleton INSTANCE=new Singleton();
你是不是说这种方法不是lazy init的?但我试验的结果就是laze的。
即static变量不是在class加载的时候初始化的,而是在实例化此类第一个实例的时候初始化的。
不知道这是不是JVM的标准行为。
lazy只是个说法,lazy的程度是不一样的。
举例如下:
IODH模式下,只有在调用getInstance()的时候才会发生初始化。
但是
public static final Singleton INSTANCE=new Singleton();
这种模式的话,对这个类的任何访问都会触发,比如这个类有什么全局常量的访问,也会触发初始化,但是此时根本不需要初始化。
11 楼
LucasLee
2008-07-06
buaawhl 写道
以前有人讨论过。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
public class Singleton { static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
我觉得这种方法跟我提到的第一种方法没有什么区别,就是
public static final Singleton INSTANCE=new Singleton();
你是不是说这种方法不是lazy init的?但我试验的结果就是laze的。
即static变量不是在class加载的时候初始化的,而是在实例化此类第一个实例的时候初始化的。
不知道这是不是JVM的标准行为。
10 楼
buaawhl
2008-07-05
以前有人讨论过。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
一种比较好的实现方式是Initialization on Demand Holder (IODH):
public class Singleton { static class SingletonHolder { static Singleton instance = new Singleton(); } public static Singleton getInstance() { return SingletonHolder.instance; } }
能够达到Lazy Singleton的效果,即只有需要的时候,才初始化,而且只需要初始化一次。
这是依靠JVM对内部静态类&静态成员初始化的顺序机制来实现的。
这种实现方法虽然有一定的局限性,比如,只能用于静态成员,ClassLoader要确定等等,但是这种实现方法已经足够好了。
9 楼
LucasLee
2008-07-05
yxbbing 写道
# private static Singleton INSTANCE;
# public static Singleton getInstance(){
# if(INSTANCE==null){
# synchronized(Singelton.class){
# //Double checking
# if(INSTANCE==null){
# INSTANCE=new Singleton();
# }
# }
# }
# }
1. private static int hasInitialized=0;
2. private static Singleton INSTANCE;
3. public static Singleton getInstance(){
4. if(hasInitialized==0){
5. synchronized(Singelton.class){
6. //Double checking
7. if(hasInitialized==0){
8. INSTANCE=new Singleton();
9. hasInitialized=1;
10. }
11. }
12. }
13. }
差不多吗
# public static Singleton getInstance(){
# if(INSTANCE==null){
# synchronized(Singelton.class){
# //Double checking
# if(INSTANCE==null){
# INSTANCE=new Singleton();
# }
# }
# }
# }
1. private static int hasInitialized=0;
2. private static Singleton INSTANCE;
3. public static Singleton getInstance(){
4. if(hasInitialized==0){
5. synchronized(Singelton.class){
6. //Double checking
7. if(hasInitialized==0){
8. INSTANCE=new Singleton();
9. hasInitialized=1;
10. }
11. }
12. }
13. }
差不多吗
你没有仔细研究第一个方法为什么有问题,及第二种方法为什么解决了它的问题,当然会觉得差不多了。
8 楼
yxbbing
2008-07-04
# private static Singleton INSTANCE;
# public static Singleton getInstance(){
# if(INSTANCE==null){
# synchronized(Singelton.class){
# //Double checking
# if(INSTANCE==null){
# INSTANCE=new Singleton();
# }
# }
# }
# }
1. private static int hasInitialized=0;
2. private static Singleton INSTANCE;
3. public static Singleton getInstance(){
4. if(hasInitialized==0){
5. synchronized(Singelton.class){
6. //Double checking
7. if(hasInitialized==0){
8. INSTANCE=new Singleton();
9. hasInitialized=1;
10. }
11. }
12. }
13. }
差不多吗
# public static Singleton getInstance(){
# if(INSTANCE==null){
# synchronized(Singelton.class){
# //Double checking
# if(INSTANCE==null){
# INSTANCE=new Singleton();
# }
# }
# }
# }
1. private static int hasInitialized=0;
2. private static Singleton INSTANCE;
3. public static Singleton getInstance(){
4. if(hasInitialized==0){
5. synchronized(Singelton.class){
6. //Double checking
7. if(hasInitialized==0){
8. INSTANCE=new Singleton();
9. hasInitialized=1;
10. }
11. }
12. }
13. }
差不多吗
7 楼
LucasLee
2008-07-04
biubiu 写道
除了你已经提出的两种办法,没有其他可以run everywhere的办法了。
我最后提出的一种方案不行么?
6 楼
LucasLee
2008-07-04
slangmgh 写道
JVM 不保证代码INSTANCE=new Singleton() 一定在hasInitialized=1之前执行!!!
这个不会吧?你的证据呢?
我提到的out-of-order write只是对INSTANCE=new Singleton()范围而言。
连两条语句的顺序都无法保证,这个就难以想象了。。。
5 楼
LucasLee
2008-07-04
weiqingfei 写道
private static int hasInitialized=0;
private static Singleton INSTANCE;
public static synchronized Singleton getInstance(){
if(hasInitialized==0){
synchronized(Singelton.class){
//Double checking
if(hasInitialized==0){
INSTANCE=new Singleton();
hasInitialized=1;
}
}
}
}
private static Singleton INSTANCE;
public static synchronized Singleton getInstance(){
if(hasInitialized==0){
synchronized(Singelton.class){
//Double checking
if(hasInitialized==0){
INSTANCE=new Singleton();
hasInitialized=1;
}
}
}
}
谢谢提醒,我已经修改了,笔误。
4 楼
biubiu
2008-07-04
除了你已经提出的两种办法,没有其他可以run everywhere的办法了。
发表评论
-
用Eclipse在Web项目引用Java项目时实现热部署
2007-03-09 11:28 18875以前也研究过Eclipse里Web Project引用Java ... -
PreparedStatement与Statement性能详细对比
2007-01-22 22:28 11807我对PreparedStatement和Statement的性 ... -
谨慎重写代码
2007-01-19 17:39 4931程序员很容易就会产生重写的冲动,因为推倒重来比维护一个现有系统 ... -
使用DBCP连接池检测未关闭的数据库连接
2006-11-17 14:22 8924我一直使用DBCP连接池,效果还不错。 最近因为朋友的一个J2 ... -
权限控制系统概述
2006-10-26 10:10 7114权限概念中,我认为原子元素只有三种:用户、功能权限、数据权限。 ... -
用Java编写Oracle存储过程
2006-10-24 15:17 25030Oracle里可以使用多种语言来编写存储过程,比如Pro*C/ ... -
Re: 你的系统是跨平台的吗?
2006-10-20 14:41 4231楼主总结得还不错。不过看上去似乎经验不足。(我说错了请原谅我) ... -
B/S是趋势和主流?
2006-10-12 16:40 8652我对B/S是趋势和主流这 ... -
Re: 复杂商品分类的表如何建立?
2006-10-12 12:38 4444zww80216 写道复杂商品的 ... -
实现数据库兼容并不象你想象的那么难
2006-10-12 10:58 5436ylt 写道 我同意Readonly的观点。如果不用hql,想 ... -
缺陷管理系统ClearBug发布
2006-09-18 16:41 8108看看网上流行的各种缺陷管理系统,总是觉得有所缺憾。 BugZi ... -
开源琴棋报表1.3.3发布
2006-09-18 16:24 16468轻量级。功能简明,易于使用,适用与中小型应用。 特别针对中国 ... -
Web服务器开发环境下的线程安全问题
2006-09-18 10:58 5701Servlet是在多线程环境下 ... -
MySQL5之使用经验
2006-09-18 10:57 6337MySQL5支持视图、存储过程、触发器等高级特性了,终于象个完 ... -
编程方法的发展
2006-09-18 10:56 7069我想了解一下软件开发中的编程方法的历史,以及现在流行的方法的来 ... -
如何删除字典数据?
2006-09-01 15:29 4406所谓字典就是数据库应用中被其他表(通常加以外键约束)引用的表, ...
相关推荐
单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,...
"设计模式单例模式和工厂模式综合应用"的主题聚焦于两种常用的设计模式:单例模式和工厂模式,并探讨它们如何协同工作来实现高效、灵活的代码结构。这个主题尤其适用于Java编程语言,因为Java的面向对象特性使得设计...
单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在C#中,单例模式常用于管理共享资源或控制类的实例化过程,以提高性能、节约系统资源,特别是在整个应用程序生命周期内只需要一...
单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们...
在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。线程安全的单例模式在多线程环境下尤其重要,因为不正确的实现可能导致多个线程创建多个实例,这违反了单例模式...
**设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...
Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式Java SE程序 单例模式...
单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置对象等。下面将详细介绍七种常见的单例模式实现...
单例模式是一种设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在软件工程中,单例模式常用于控制资源的共享,比如数据库连接池...理解并正确使用单例模式对于构建高效、稳定的系统至关重要。
在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。在这个特定的场景中,我们讨论的是一个实现了单例模式的日志类,该类专为多线程环境设计,具备日志等级控制、...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...
Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...
由于该工具对于操作系统来说是独一无二且不可重复开启的,因此它符合单例模式的核心特点——确保任何时候都只有一个实例存在。这不仅简化了用户的操作体验,也提高了系统的稳定性和安全性。 **2. Windows Recycle ...
单例模式是软件设计模式中的经典模式之一,其主要目的是控制类的实例化过程,确保在应用程序的整个生命周期中,某个类只有一个实例存在。这样的设计通常适用于那些需要频繁创建和销毁,但资源消耗较大的对象,如...
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java或类似的面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。在这个...
首先向关注过我这个系列...这立刻让我想到了最常用也是最简单最容易理解的一个设计模式 单例模式 何为 单例模式 ? 故名思议 即 让 类 永远都只能有一个实例。 由于 示例代码 比较简单 我也加了注释,这里就不在赘述
单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象创建成本较高,或者需要共享资源的情况下非常...
### 连接数据库单例模式解析 在软件开发过程中,特别是在涉及到数据库操作的应用程序中,合理地管理和控制数据库连接是非常重要的。不当的数据库连接管理可能会导致资源浪费、性能下降甚至是系统崩溃等问题。为了...