java面试题网

普通会员

162

帖子

12

回复

171

积分

楼主
发表于 2018-05-25 14:23:46 | 查看: 5252| 回复: 2

单例模式

5种实现方式 ?

1.饿汉模式(调用效率高,但是不能延时加载):

2.懒汉模式(调用效率不高,但是能延时加载):

3.双重检测锁模式(由于JVM底层模型原因,偶尔会出问题,不建议使用):

4.静态内部类式(线程安全,调用效率高,可以延时加载):

5.枚举类(线程安全,调用效率高,不能延时加载,可以天然的防止反射和反序列化调用):

如何选用:

    单例对象 占用资源少,不需要延时加载,枚举 好于 饿汉

    单例对象 占用资源多,需要延时加载,静态内部类 好于 懒汉式 

单例模线程安全吗?  

    不安全 。

一般如何保证它线程安全 ?  

    double-check 双重检查锁定  。

修饰符 volatile  有什么作用 ?

    能保证被它修饰的成员变量可以被多个线程正确的处理。Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。它在某些情况下比synchronized的开销更小



文章来自www.wityx.com,转载请注明出处!原文地址http://www.wityx.com/post/420_1_1.html


java面试题交流群:327440556

普通会员

217

帖子

75

回复

160

积分
沙发
发表于 2019-05-05 16:21:45

写一个单例类

单例模式主要作用是保证在Java应用程序中,一个类只有一个实例存在。下面给出两种不同形式的单例:
第一种形式:饿汉式单例
public class Singleton {
private Singleton(){}
private static Singleton instance = new Singleton();
public static Singleton getInstance(){
return instance;
}
}

第二种形式:懒汉式单例
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance(){
if (instance==null) instance=newSingleton();
return instance;
}
}
单例的特点:外界无法通过构造器来创建对象,该类必须提供一个静态方法向外界提供该类的唯一实例。
【补充】用Java进行服务器端编程时,使用单例模式的机会还是很多的,服务器上的资源都是很宝贵的,对于那些无状态的对象其实都可以单例化或者静态化(在内存中仅有唯一拷贝),如果使用了spring这样的框架来进行对象托管,Spring的IoC容器在默认情况下对所有托管对象都是进行了单例化处理的。 

普通会员

115

帖子

83

回复

169

积分
板凳
发表于 2019-09-24 15:43:02

单例设计模式

1)设计模式:解决某类问题行之有效的方法,是一种思想,是规律的总结

2)用来保证某个类在内存中只有一个对象

3)保证唯一性的思想及步骤

1. 为了避免其他程序建立该类对象,先禁止其他程序建立该类对象,即将构造函数私有化

2. 为了其他程序访问到该类对象,须在本类中创建一个该类私有对象

3. 为了方便其他程序访问到该类对象,可对外提供一个公共访问方式

比如API中的Runtime类就是单例设计模式。

4)单例设计模式的两种方式

饿汉式 当类加载的时候,就创建对象。

实例:折叠

  1. public class Student {
  2. // 私有化构造函数
  3. private Student() {
  4. }
  5.  
  6. // 创建对象
  7. private static Student s = new Student();
  8.  
  9. // 返回对象实例
  10. public static Student getInstance() {
  11. return s;
  12. }
  13. }

懒汉式 当使用的时候,才去创建对象。

实例:折叠

  1. public class Student {
  2. // 声明变量
  3. private Student() {
  4. }
  5.  
  6. // 声明变量
  7. private static Student s = null;
  8.  
  9. // 提供对外方法
  10. public static Student getInstance() {
  11. if (s == null) {
  12. // 线程1就进来了,线程2就进来了。
  13. s = new Student();
  14. }
  15. return s;
  16. }
  17. }

饿汉式和懒汉式的区别:

  • 饿汉式是类一加载进内存就创建好了对象;
  • 懒汉式则是类才加载进内存的时候,对象还没有存在,只有调用了getInstance()方法时,对象才开始创建。

懒汉式是延迟加载,如果多个线程同时操作懒汉式时就有可能出现线程安全问题,可以加同步来解决线程安全问题。但是加了同步之后,每一次都要比较锁,效率就变慢了,所以可以加双重判断来提高程序效率。

注:开发常用饿汉式,因为饿汉式简单安全。懒汉式多线程的时候容易发生问题

您需要登录后才可以回帖 登录 | 立即注册

java面试题网www.wuliaokankan.cnjava建站系统提供技术支持V2.1 网站地图 © 2016-2018