线程问题

sunny906 2010-01-26 03:13:06
有三个不同的线程:A、B、C和一个实例化对象的方法:void InitObject();
这三个线程是同时执行的,顺序分别为C、A、B
每个线程执行的时候都要调用InitObject(),即每个线程都会实例化同一个对象,而且实例化的结果都是一样的
但我只想实例化一次,并且这三个线程必须都执行
请问有什么方法可以实现?有没有可能把这三个线程合并成一个,让合并后的线程去调用InitObject()?
...全文
173 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
sunny906 2010-01-27
  • 打赏
  • 举报
回复
用单例模式后,对象保证了一个,但是方法还是被执行了多次
怎么样才能使方法也只被执行一次?
请教各位!
whitechololate 2010-01-27
  • 打赏
  • 举报
回复
单例模式,搜一下,很多的
sunny906 2010-01-27
  • 打赏
  • 举报
回复
RFEZGC 2010-01-26
  • 打赏
  • 举报
回复
每日回帖
cqzs632 2010-01-26
  • 打赏
  • 举报
回复
帮顶~~呵呵
sunny906 2010-01-26
  • 打赏
  • 举报
回复
sunny906 2010-01-26
  • 打赏
  • 举报
回复
再顶
sunny906 2010-01-26
  • 打赏
  • 举报
回复
顶一下
能不能两个线程只输出1、2、3、4、5
流氓兔 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lianshaohua 的回复:]
引用楼主 sunny906 的回复:
有三个不同的线程:A、B、C和一个实例化对象的方法:void InitObject();
这三个线程是同时执行的,顺序分别为C、A、B
每个线程执行的时候都要调用InitObject(),即每个线程都会实例化同一个对象,而且实例化的结果都是一样的
但我只想实例化一次,并且这三个线程必须都执行
请问有什么方法可以实现?有没有可能把这三个线程合并成一个,让合并后的线程去调用InitObject()?

1、线程的执行顺序是不确定的,除非你自己硬性控制了,
2、用单例模式吧,但三个线程如果都要修改对象的话,要加锁,即:先lock(对象)再访问
[/Quote]
sunny906 2010-01-26
  • 打赏
  • 举报
回复
在“逍遥剑客的专栏 - CSDN博客”里看到的一个例子:
public sealed class Singleton
{
Singleton()
{
}

public static Singleton Instance
{
get
{
return Nested.instance;
}
}

class Nested
{
internal static readonly Singleton instance;

static Nested()
{
instance = new Singleton();
}
}

private int num = 0;

/**//// <summary>
/// 增加
/// </summary>
public void Add()
{
num++;
Console.WriteLine("输出:" + num);
}

}

//--------------------------------------------------------------

class Program
{
public static void Print()
{
Singleton singleton = Singleton.Instance;
lock (singleton)
{
for (int i = 0; i < 5; i++)
{
singleton.Add();
}
}
}

static void Main(string[] args)
{
Thread threadFst = new Thread(new ThreadStart(Print));
threadFst.Name = "Fst";
Thread threadScd = new Thread(new ThreadStart(Print));
threadScd.Name = "Scd";
threadFst.Start();
threadScd.Start();
Console.ReadLine();
}
}
这段代码执行过后,输出的是1、2、3、4、5、6、7、8、9、10
单件模式不是在第一次使用这个对象的时候才对这个对象进行初始化吗?可为什么两个线程都执行了输出操作?
不太明白,请教各位
sunny906 2010-01-26
  • 打赏
  • 举报
回复
谢谢各位,我先看看
  • 打赏
  • 举报
回复
使用单例吧,提供全局访问点,大致代码如下:

Class SingletonClass
{
private static volatile SingletonClass sc;
private static object syncLock = new object();
Public static SingletonClass GetSc()
{
if (sc == null)
{
lock (syncLock)
{
if (sc == null)
{
sc = new SingletonClass();
}
}
}
return sc;
}
}
wwwwpig 2010-01-26
  • 打赏
  • 举报
回复
参考一下吧
using System;

namespace SigletonPattern.Sigleton
{
/**//// <summary>
/// 功能:在C#用双重锁定实现单件模式
/// 编写:Terrylee
/// 日期:2005年12月06日
/// </summary>
public class DoubLockSigleton
{

//volatile 表示编译器不能自动优化调试语句.(避免调整语句位置和顺序导致初始化时间点不正确.sky)
private static volatile DoubLockSigleton instance;

/**//// <summary>
/// 辅助锁对象,本身没有意义
/// </summary>
private static object syncRoot = new Object();

/**//// <summary>
/// 构造方法改为Private
/// </summary>
private DoubLockSigleton()
{

}

public static DoubLockSigleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new DoubLockSigleton();
}
}

return instance;
}
}

}
}
nicetfox 2010-01-26
  • 打赏
  • 举报
回复
有没有实例
sunny906 2010-01-26
  • 打赏
  • 举报
回复
没用过单例模式,能不能通俗地解释一下
谢谢
sunny906 2010-01-26
  • 打赏
  • 举报
回复
能不能Example一下,谢谢!
ztenv 2010-01-26
  • 打赏
  • 举报
回复
[Quote=引用楼主 sunny906 的回复:]
有三个不同的线程:A、B、C和一个实例化对象的方法:void InitObject();
这三个线程是同时执行的,顺序分别为C、A、B
每个线程执行的时候都要调用InitObject(),即每个线程都会实例化同一个对象,而且实例化的结果都是一样的
但我只想实例化一次,并且这三个线程必须都执行
请问有什么方法可以实现?有没有可能把这三个线程合并成一个,让合并后的线程去调用InitObject()?
[/Quote]
1、线程的执行顺序是不确定的,除非你自己硬性控制了,
2、用单例模式吧,但三个线程如果都要修改对象的话,要加锁,即:先lock(对象)再访问
白头老汉 2010-01-26
  • 打赏
  • 举报
回复
把构造函数写成静态的不就可以了么?
辉太郎 2010-01-26
  • 打赏
  • 举报
回复
设计模式中的单件模式可以解决你的这个问题,只对同一个对象实例化一遍,保证只有一个对象的实例!
加载更多回复(1)

110,535

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧