java疑问 singleton是什么意思 (java疑难问题)
本文目录导航:
java疑问:singleton是什么意思?
Singleton的意思是单例形式。
单例形式是一种软件设计形式,其重要目标是确保一个类在整个运行程序中只要一个实例,并提供一个全局点来访问这个实例。
在Java中,这种形式常罕用于治理资源、性能等须要频繁访问且不应该存在多个实例的状况。
经过单例形式,可以确保对象的惟一性,缩小内存开支和防止潜在的多实例造成的疑问。
上方是几个对于单例形式的
单例形式的解释:
1. 定义与目标:单例形式是一种创立对象的形式,它确保一个类只要一个实例,并提供一个全局访问点。
这种形式罕用于在运行程序中控制某些资源的访问,如数据库衔接、文件操作等。
由于只要一个实例,因此可以节俭系统资源并提高性能。
2. 成功形式:Java中单例形式的成功有多种形式,包含饿汉式、懒汉式、双重审核锁定等。
这些成功形式各有特点,须要依据详细的运行场景和需求来选用。
3. 好处与缺陷:单例形式的好处在于它简化了对象创立和访问的复杂性,防止了不用要的对象创立和销毁开支。
但是,适度经常使用单例形式也或者造成系统难以测试和保养,特意是在大型名目中。
适度依赖单例或者造成代码耦合度参与,使得系统愈加难以裁减和保养。
4. 运行场景:单例形式实用于须要频繁访问资源或性能的状况,如日志记载、数据库衔接治理、缓存治理等。
此外,在一些特定的场景下,如Windows的义务治理器或打印机的治理,也须要经常使用单例形式来确保只要一个实例提供服务。
总的来说,单例形式是一种罕用的软件设计形式,它确保了类的惟一实例性,并提供了全局访问点。
在实践运行中须要依据详细状况选用能否经常使用单例形式,并正当地设计其成功形式。
一种共同的单例形式写法,应用final语义成功
单例形式是Java编程中一个经典话题,理论有静态外部类、枚举、双重审核锁定(Double-Checked Locking)等多种成功方法。
最近,我留意到一种经常使用final语义成功线程安保单例形式的陈腐形式。
final除了作为类、方法、属性无法变的标记外,还隐含着读写重排序规定。
这一规定的存在是为了处置Java内存模型中一个关键缺陷:线程或者会在未初始化final域的状况下读取其值。
经过增强final的语义,JSR-133专家组引入了写和读重排序规定,以确保对象在结构函数正确构建时,任何线程都能看到其final域的初始化值,无需经常使用同步操作。
final域的写规定保障了在对象援用可用之前,final域曾经被正确初始化,而个别域不具有这一保障。
同样,final域的读规定制止处置器在读取final域之前重排序读取对象援用的操作。
这一规定经过在读final域前拔出LoadLoad屏障成功。
在讨论了final语义及其规定之后,让咱们回到经典的双重审核锁写法。
其中,volatile关键字被用于防止指令重排序,确保对象实例在初始化前无法访问。
而经常使用final语义能否能成功相似成果?答案是必需的。
经过参考CMU的SEI CERT wiki,咱们发现经常使用final语义代替volatile的双重审核锁写法。
这一写法在实质上与经常使用volatile的DCL相似。
但是,SEI CERT指出,这种写法在某些Java虚构机平台上或者无法成功,由于第一次性和第三次读取没有建设happens-before相关。
这象征着编译器或者在读取时缓存或从新排序造成失掉到null值。
Java的happens-before规定定义了操作之间的顺序相关,确保了程序的正确口头。
在经常使用final语义成功的单例形式中,假设第一次性读取对象援用为非null,则后续读取也应为非null,除非存在编译器缓存或不同成功的差异。
为了更深化了解Java并发编程,本文讨论了final语义,但并不介绍在实践代码中经常使用。
我更偏差于经常使用Guava的Suppliers成功单例形式,这种方法繁复且易于了解,相比自定义DCL或静态外部类、枚举成功更直观。
什么叫单例形式,如何成功,有什么作用?
就是只要一个实例,最便捷的单例形式可以用static来成功。
比如上方的_Context变量就是用了单利形式,上方的代码就是外面想调用_Context时,假设_Context曾经实例化,那么间接前往,假设没实例化,就实例化它再前往。
全局只要一个_Context比如public class EESGateway{private static EESDatabaseDataContext _Context = null;//EESDatabasDataContex Instanceprivate const string databaseName = EESDatabase;//Database name/// <summary>/// Return EESDatabaseDataContext instance. /// </summary>/// <returns>EESDatabaseDataContext instance</returns>public static EESDatabaseDataContext DataContext(){if (_Context == null){lock (typeof(EESGateway)){//formate a new string to store the connectionStringString connectionString = [EESDatabase];//create a dataContext using the connectionString above_Context = new EESDatabaseDataContext(connectionString);}}return _Context;}}