本次的标题是我在写单例模式的博客时遇到的问题,所以今天专门写了的demo让自己记住怎么简单的使用多线程。

一直纠结的是怎么在for循环中多次实例化对象,好复现单例模式在没有加锁的情况下出现多个实例对象的错误。

先给大家看一下我简单实现的多线程实例对象。

方案一:

Demo.cs

    public class Demo
{
private static Demo _demo = null; /// <summary>
/// 构造函数
/// </summary>
private Demo()
{
Console.WriteLine("构造了{0}", GetType().Name);
} /// <summary>
/// 获取该类的唯一实例
/// </summary>
/// <returns>该类的唯一实例</returns>
public static Demo GetInstance()
{
if (_demo == null)
_demo = new Demo();
return _demo;
}
}

Program.cs,客户端代码

                Demo d1 = null;
Demo d2 = null;
//多线程创建对象实例
var t1 = new Thread(() => { d1 = Demo.GetInstance(); });
var t2 = new Thread(() => { d2 = Demo.GetInstance(); }); t1.Start();
t2.Start();
Thread.Sleep();//主线程等待子线程执行完成,为d1和d2变量赋值
Console.WriteLine("d1 == d2 {0}", object.ReferenceEquals(d1, d2));
Console.Read();

输出:

输出两个不一样引用的对象,达到了我想要的目的。

但是在我的脑海中,一直有个关于for循环可以多线程创建实例的方法,就是想不起来,今天在查资料的时候无意中看到了这种方法,我就立马记下来,然后晚上加个班写出来,这样在脑子中有个印象。

方案二:

Program.cs

                for (int i = ; i < ; i++)
{
new Action(() => { Demo.GetInstance(); }).BeginInvoke(null, null);
}
Console.Read();

输出:

这样调试单例模式的时候就可以复现未加锁的错误了,也解决了我心头的疑问,找到了解决for循环中多线程创建实例的方法。

实在是开心呐!

c# 多线程 创建对象实例的更多相关文章

  1. (转) C#多线程赛跑实例

    专于:http://blog.csdn.net/lidatgb/article/details/8363035 结合上篇<多线程的基础>,这次我们写一个多线程的赛跑实例,内容很简单:超人和 ...

  2. vc 基于对话框多线程编程实例——线程之间的通信

     vc基于对话框多线程编程实例——线程之间的通信 实例:

  3. C#多线程编程实例 螺纹与窗口交互

    C#多线程编程实例 螺纹与窗口交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = new Thread ...

  4. linux下C语言多线程编程实例

    用一个实例.来学习linux下C语言多线程编程实例. 代码目的:通过创建两个线程来实现对一个数的递加.代码: //包含的头文件 #include <pthread.h> #include ...

  5. Java单线程多实例和多线程多实例

    最近写了一个程序,是采用多线程往redis里面写入数据,想统计一下一共写了多少条数据,于是用了一个static的全局变量count来累加,这块代码抽象出来就是这样的: public class Mul ...

  6. C#多线程编程实例 线程与窗体交互

    C#多线程编程实例 线程与窗体交互 代码: public partial class Form1 : Form { //声明线程数组 Thread[] workThreads = ]; public ...

  7. java多线程编程实例

    [转]这篇文章主要介绍了java多线程编程实例,分享了几则多线程的实例代码,具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下. 1.三个售票窗口同时出售20张票程序分析:   ...

  8. Java 多线程 简单实例 (Runnable)

    1.多线程实例 package second; public class A implements Runnable { public char stat = '*'; public void run ...

  9. Java 多线程 简单实例 (Thread)

    package second; public class A extends Thread { public void run(){ for(int i = 1;i <= 10 ; i++){ ...

随机推荐

  1. MySql俩种分页区别(注意)

    注意俩个分页的区别哦~ SELECT * FROM city LIMIT 2 OFFSET 1; 从第二条记录开始 取二条记录 如下: SELECT * FROM city LIMIT 3,2; 从第 ...

  2. 初识Tensorboard

    1.什么是Tensorboard? PPT设计原则中有这样一条,叫"文不如表,表不如图",可见图表在表达中更为直观.明确.程序设计中也是一样,我们经常用图表来描述程序的结构和流程, ...

  3. AES加密解密算法---java

    package com.BFGJ.AES; import java.util.Random; import java.util.StringTokenizer; import javax.crypto ...

  4. SQL储存过程

    基本语法 创建存储过程 create procedure sp_name @[参数名] [类型],@[参数名] [类型] as begin ......... end 以上格式还可以简写成: crea ...

  5. Java基础——封装

    最近学习Java面向对象方面的知识点,一直没时间更新博客,因为这块的知识点真的蛮绕的.一个知识点一个知识点的往外冒,而且对于我这个初学者来说区分构造器和方法就花费了一整天的时间.现在准备再重新过一遍知 ...

  6. SQLServer 理解copyonly备份操作

    标签:MSSQL/日志截断 概述 Alwayson在添加数据库的过程中如果同步首选项选择的是“完整”,那么就会在主副本上执行copyonly的完整备份和日志备份在辅助副本上执行还原操作,也正是这个操作 ...

  7. echarts3 清空上一次加载的series数据

    今天做图表的时候发现了一个问题,想和大家分享一下 我有一个下拉选框,每次选中都切换不同的数据,数据是从后台查询获取的,但是如果后台返回了数据每次渲染都没有问题,如果后台没有返回数据,但是我在渲染图表的 ...

  8. postcss使用

    准备 构建工具为Gulp基于PostCSSPostCSS插件 CSSNext 用下一代CSS书写方式兼容现在浏览器PostCSS插件 Autoprefixer 为CSS补全浏览器前缀PostCSS插件 ...

  9. Example004自动关闭的广告窗口

    <!-- 实例004自动关闭的广告窗口--> <!-- 3秒后关闭 --> <body onload="window.setTimeout('window.cl ...

  10. 5.VBS的一些约定,提高可读性

    1.变量命名约定 2.变量作用域 1)过程级,在事件中,函数或者子过程中 2)Script级,在head部分 原则,定义尽量小的作用域 3.在某个过程开头应该包括这些注释