java设计模式有哪些,java设计模式及应用案例

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: