博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
单例模式再次理解
阅读量:6641 次
发布时间:2019-06-25

本文共 2345 字,大约阅读时间需要 7 分钟。

1.“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”就是static的getInstance方法,因为普通对象是通过new实例来访问,单例对象没法new,自能通过static方法来访问了。

1.“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”就是static的getInstance方法,因为普通对象是通过new实例来访问,单例对象没法new,自能通过static方法来访问了。

1.“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”就是static的getInstance方法,因为普通对象是通过new实例来访问,单例对象没法new,自能通过static方法来访问了。

1.“保证一个类仅有一个实例,并提供一个访问它的全局访问点。”就是static的getInstance方法,因为普通对象是通过new实例来访问,单例对象没法new,自能通过static方法来访问了。

 

2.用途:如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。

3.展示临时状态,瞬间状态。唯一性

3.展示临时状态,瞬间状态。唯一性

3.展示临时状态,瞬间状态。唯一性

 

4.如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。

4.如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。

4.如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。

 

5.显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

5.显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

5.显然单例模式的要点有三个;一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。

 

一般Singleton模式通常有三种形式:
第一种形式:懒汉式,也是常用的形式。
1
2
3
4
5
6
7
8
9
10
11
public 
class 
SingletonClass{
    
private 
static 
SingletonClass instance=
null
;
    
public 
static
 
synchronized
 SingletonClass getInstance(){
        
if
(instance==
null
){
               
instance=
new 
SingletonClass();
        
}
        
return 
instance;
    
}
    
private 
SingletonClass(){
    
}
}
第二种形式:饿汉式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//对第一行static的一些解释
// java允许我们在一个类里面定义静态类。比如内部类(nested class)。
//把nested class封闭起来的类叫外部类。
//在java中,我们不能用static修饰顶级类(top level class)。
//只有内部类可以为static。
public 
class 
Singleton{
    
//在自己内部定义自己的一个实例,只供内部调用
    
private 
static 
final Singleton instance = 
new 
Singleton();
    
private 
Singleton(){
        
//do something
    
}
    
//这里提供了一个供外部访问本class的静态方法,可以直接访问
    
public 
static 
Singleton getInstance(){
        
return 
instance;
    
}
}
第三种形式: 双重锁的形式。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public 
class 
Singleton{
    
private 
static 
volatile 
Singleton instance=
null
;
    
private 
Singleton(){
        
//do something
    
}
    
public 
static  
Singleton getInstance(){
        
if
(instance==
null
){
            
synchronized(SingletonClass.
class
){
                
if
(instance==
null
){
                    
instance=
new 
Singleton();
                
}
            
}
        
}
        
return 
instance;
     
}
}
//这个模式将同步内容下方到if内部,提高了执行的效率,不必每次获取对象时都进行同步,只有第一次才同步,创建了以后就没必要了。
//这种模式中双重判断加同步的方式,比第一个例子中的效率大大提升,因为如果单层if判断,在服务器允许的情况下,
//假设有一百个线程,耗费的时间为100*(同步判断时间+if判断时间),而如果双重if判断,100的线程可以同时if判断,理论消耗的时间只有一个if判断的时间。
//所以如果面对高并发的情况,而且采用的是懒汉模式,最好的选择就是双重判断加同步的方式。

 

转载地址:http://heavo.baihongyu.com/

你可能感兴趣的文章
贪心算法之最优装载
查看>>
codeforces 609C Load Balancing
查看>>
Aizu 2300 Calender Colors(暴力)
查看>>
$rootScope
查看>>
Asp.net core 学习笔记 ( DI 依赖注入 )
查看>>
Asp.net core 学习笔记 ( Azure key-vault )
查看>>
[转载] 杜拉拉升职记——17 招人难,求职也难
查看>>
cas系列-cas登出(四)
查看>>
Java练习 SDUT-1149_计算题
查看>>
运行shell脚本的三种方式
查看>>
Java I/O总结
查看>>
学习笔记之scikit-learn
查看>>
用java集合模拟登录和注册功能
查看>>
安装CPqD/ofdissector遭遇的错误
查看>>
C++ 顺序容器
查看>>
Linux下安装ElasticSearch 5 和配置外部访问
查看>>
微信授权登录
查看>>
去除多余样式
查看>>
NuGet Package Explorer使用教程下载
查看>>
还有5个月就NOIP2019了,我干了什么
查看>>