java设计模式有哪些,java设计模式及应用案例
JAVA设计模式-singleton模式singleton模式类只能有一个实例,对象将在内存中创建,并且只能创建一次。其他所有需要调用的类或者其他地方都使用这个对象,可以防止频繁创建对象,占用内存高。特点:只能有一个实例,可以自己创建这个实例的类。
一介绍饿了么中文模式的实现,加载类的时候已经创建了对象,线程是安全的,但是会浪费资源。
示例代码公共类Singleton {
/**
*私有构造方法,它可以防止new在进行外部调用时创建对象。
*/
私有Singleton(){ };
/**
*创建私有对象
*/
私有静态Singleton Singleton=new Singleton();
/**
*提供公共外部访问方法。
* @返回
*/
公共静态Singleton getInstance(){
返回单例;
}
}写2介绍加载类的时候已经创建了对象。这里,静态代码块用于创建它,线程是安全的。
示例代码公共类Singleton {
/**
*私有构造方法,它可以防止new在进行外部调用时创建对象。
*/
私有Singleton(){ };
/**
*创建私有对象
*/
私有静态Singleton singleton=null
静态{
Singleton=new Singleton();
}
/**
*提供公共外部访问方法。
* @返回
*/
公共静态Singleton getInstance(){
返回单例;
}
}懒惰模式写作I介绍第一次使用时创建对象。如果多个线程同时调用getInstance()方法,可能会创建多个对象,线程是不安全的。
示例代码公共类Singleton {
/**
*私有构造方法,它可以防止new在进行外部调用时创建对象。
*/
私有Singleton(){ };
/**
*创建私有对象。请注意,这里不执行新的创建。
*/
私有静态Singleton singleton
/**
*提供公共外部访问方法。
* @返回
*/
公共静态Singleton getInstance(){
//当多个线程同时执行此端时,可能会创建多个对象。
if(singleton==null){
Singleton=new Singleton();
}
返回单例;
}
}第二种编写方法介绍这种编写方法在第一次调用时也创建对象,但是在这种方法中加入了synchronized同步锁,这样只能执行一个线程。线程是安全的,但是synchronized在1.6之前性能很差,1.6之后进行了优化,性能有所提升。不过,为了保证线程安全,这里使用synchronized还是会对性能有所影响。
示例代码公共类Singleton {
/**
*私有构造方法,它可以防止new在进行外部调用时创建对象。
*/
私有Singleton(){ };
/**
*创建私有对象。请注意,这里不执行新的创建。
*/
私有静态Singleton singleton
/**
*提供公共外部访问方法。
* @返回
*/
公共静态同步单例getInstance(){
//在第一次调用时创建对象。
if(singleton==null){
Singleton=new Singleton();
}
返回单例;
}
}写法3介绍这种写法,使用双锁进行判断,创建对象。线程不安全。
分析线程不安全的原因:首先,在内存中创建对象,这是需要做的
分配内存地址
初始化对象
将对象设置为指向刚刚分配的内存地址。
然而,指令重新排序在编译器、指令集并行性和存储器中是可能的。如果发生指令重排序,对于单线程,如果执行 和执行 的结果相同,但如果是多线程,线程A执行完 后,如果线程B进入第一条If语句,就会判断singleton已经指向一个地址,不等于null,直接返回。此时,返回的对象是一个尚未初始化的空对象。
示例代码公共类Singleton {
/**
*私有构造方法,它可以防止new在进行外部调用时创建对象。
*/
私有Singleton(){ };
/**
*创建私有对象。请注意,这里不执行新的创建。
*/
私有静态Singleton singleton
/**
*提供公共外部访问方法。
* @返回
*/
公共静态Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
Singleton=new Singleton();
}
}
}
返回单例;
}
}编写方法4介绍在编写方法3的基础上增加了volatile,可以禁止指令重排序,保证共享变量的不同线程之间的可见性。
示例代码公共类Singleton {
/**
*私有构造方法,它可以防止new在进行外部调用时创建对象。
*/
私有Singleton(){ };
/**
*创建私有对象。注意,这里不创建new,而是使用volatile。
*/
私有易失静态Singleton singleton
/**
*提供公共和外部访问方法。
* @返回
*/
公共静态Singleton getInstance(){
if(singleton==null){
synchronized (Singleton.class){
if(singleton==null){
Singleton=new Singleton();
}
}
}
返回单例;
}
}版权归作者所有:原创作品来自博主小二上九8,转载请联系作者获得授权,否则将追究法律责任。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。