秀纳

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::
Singleon类:
    //应对于单线程
    public class SingletonA
    
{
        
private static SingletonA instance;

        
//一个私有的构造器,禁用构造器
        private SingletonA() {}

        
public static SingletonA Instance
        
{
            
get
            
{
                
if (instance == null)
                
{
                    instance 
= new SingletonA();
                }

                
return instance;
            }

        }

    }


    
//应对于多线程
    public class SingletonB
    
{
        
//volatile关键字用于禁止编译器对指定的顺序进行微调。
        private static volatile SingletonB instance = null;

        
private static object lockHelper = new object();

        
//一个私有的构造器,禁用构造器
        private SingletonB() {}

        
public static SingletonB Instance
        
{
            
get
            
{
                
//双锁,用于保证只一个线程使用这里,防止多线程产生多个实例。
                if (instance == null)
                
{
                    
lock (lockHelper)
                    
{
                        
if (instance == null)
                            instance 
= new SingletonB();
                    }

                    
                }

                
return instance;
            }

        }

    }

主程序:
        public static void Main()
        
{
            SingletonA t1 
= SingletonA.Instance;

            SingletonA t2 
= SingletonA.Instance;

            Console.WriteLine(
object.ReferenceEquals(t1, t2) == true);
        }

MDI窗体程序中防止子窗体被多次实例化——Singleton的C#实现

首先我们有2个Windows Form,主窗体叫Form1,子窗体叫ChildForm。在主窗体中加入一Menu,用来实例化子窗体,我们在Form1.cs中写入下代码:

private static ChildForm childForm;    //静态变量,保存唯一实例

private void menuItem2_Click(object sender, System.EventArgs e)
  
{
   ChildForm childForm 
= GetChildForm();    //获取子窗体对象
   childForm.Show();    //显示之
  }


  
private ChildForm GetChildForm()
  
{
    
//先后次序不能错,前一个条件用来判断是否是第一次,后一个条件用来判断子窗体是否被关闭了
   if( childForm == null || childForm.IsDisposed )    
   
{    //第一次实例化也好,被关了也好,都重新实例化
    childForm = new ChildForm();    
    childForm.MdiParent 
= this;
   }

   
   
return childForm;
  }


posted on 2006-10-04 11:45  秀纳  阅读(159)  评论(0)    收藏  举报