Chinaunix首页 | 论坛 | 博客
  • 博客访问: 257120
  • 博文数量: 49
  • 博客积分: 110
  • 博客等级: 民兵
  • 技术积分: 510
  • 用 户 组: 普通用户
  • 注册时间: 2013-01-13 00:59
个人简介

make it run,make it better,make it fast. https://github.com/liulanghaitun

文章分类

全部博文(49)

文章存档

2023年(1)

2022年(2)

2020年(4)

2019年(4)

2017年(15)

2016年(3)

2014年(3)

2013年(14)

分类: Windows平台

2013-05-10 21:05:03

严格来说,这并不算一个模式,只是利用Java自身的特性(私有化构造函数).
如果构造函数私有化,则如下所示:
private Singleton()
{
 
}
因为构造函数私有化,所以只有在类中可以创建对象。为了获取类中创建的对象,

第一类:通过公共静态字段获取
我们可以用final进行修饰(final并不是必须的),只是更加明显的标志不变性.
package com.test;

public class Singleton
{
 public static final Singleton INSTANCE = new Singleton();
 
 private Singleton()
 {
  
 }
 
 public static void main(String[] args)
 {
  for (int index = 0; index < 5; index++)
  {
   new Thread(new Runnable()
   {  
    @Override
    public void run()
    {
     System.out.println(Singleton.INSTANCE);
    }
   }).start();
  }
 }
}
测试结果:




第二类:通过公共的静态方法来实现.
public class Singleton
{
 private Singleton()
 {
  
 }
 
 public static Singleton getInstance()
 {
  return null;
 }
}

对于对象的创建位置不同,可以分为两种,静态方法内部和外部.

第一种:静态方法内部
静态方法只能访问静态变量,所以我们可以创建静态全局变量,为了保持单一性,必须对instance进行判断.
如果instance为空则创建,否则直接返回该对象,保证对象的唯一性.
package com.test;

public class Singleton
{
 private static Singleton instance = null;
 
 private Singleton()
 {
  
 }
 
 public static Singleton getInstance()
 {
  if (null == instance)
  {
   instance = new Singleton();
  }
  return instance;
 }
 
 public static void main(String[] args)
 {
  for (int index = 0; index < 5; index++)
  {
   new Thread(new Runnable()
   {   
    @Override
    public void run()
    {
     System.out.println(Singleton.getInstance());
    }
   }).start();
  }
 }
 
}

测试结果:





从上述数据中看出,多线程的时候,必须进行数据同步.
package com.test;

public class Singleton
{
 private static Singleton instance = null;
 
 private Singleton()
 {
  
 }
 
 public static synchronized Singleton getInstance()
 {
  if (null == instance)
  {
   instance = new Singleton();
  }
  return instance;
 }
 
 public static void main(String[] args)
 {
  for (int index = 0; index < 5; index++)
  {
   new Thread(new Runnable()
   {  
    @Override
    public void run()
    {
     System.out.println(Singleton.getInstance());
    }
   }).start();
  }
 }
 
}
测试结果:





第二种:静态方法的外部
我们可以用final进行修饰(final并不是必须的),只是更加明显的标志不变性.
package com.test;

public class Singleton
{
 private static final Singleton INSTANCE = new Singleton();
 
 private Singleton()
 {
  
 }
 
 public static Singleton getInstance()
 {
  return INSTANCE;
 }
 
 public static void main(String[] args)
 {
  for (int index = 0; index < 5; index++)
  {
   new Thread(new Runnable()
   {   
    @Override
    public void run()
    {
     System.out.println(Singleton.getInstance());
    }
   }).start();
  }
 }
}
测试结果是:






第一种方式需要的时候才创建,但是多线程的时候需要进行同步.
第二种方式在类加载的时就创建,多线程的时候不需要同步 

 

阅读(1463) | 评论(0) | 转发(0) |
0

上一篇:samba安装

下一篇:观察者模式

给主人留下些什么吧!~~