用C#的lock()的问题。当lock(string)产生的问题。

l8487 2010-03-16 12:43:13
代码如下
static void Main(string[] args)
{
for (int i = 0; i <10; i++)
{
Thread td = new Thread(ReadInt);
string[] param ={ i.ToString() };
td.Start(param);
}
Console.ReadLine();
}
private static string obj="0";
public static void ReadInt(object param)
{
string[] parmm = (string[])param;
string mynumber = parmm[0].ToString();
for (int j = 0; j < 10; j++)
{
lock (obj)
{
//第一段代码。输出的内容出现重复的obj值
Console.WriteLine("我是第" + mynumber + "个线程。。我读到的值为 " + obj.ToString());
obj = (Convert.ToInt32(obj) + 1).ToString("D3");
//第二段代码。输出的内容不包含重复的obj值
//obj = (Convert.ToInt32(obj) + 1).ToString("D3");
//Console.WriteLine("我是第" + mynumber + "个线程。。我读到的值为 " + obj.ToString());
}
}
}
第一段代码输出如下:(按理说被锁住以后,不应该出现相同的obj值的)
我是第1个线程。。我读到的值为 0
我是第1个线程。。我读到的值为 001(重复值)
我是第0个线程。。我读到的值为 001(重复值)
我是第0个线程。。我读到的值为 003
我是第0个线程。。我读到的值为 004
我是第1个线程。。我读到的值为 002
我是第1个线程。。我读到的值为 006
第二段代码输出如下:(不会出现重复值。)
我是第0个线程。。我读到的值为 001
我是第1个线程。。我读到的值为 002
我是第0个线程。。我读到的值为 005
我是第0个线程。。我读到的值为 007
我是第0个线程。。我读到的值为 008
我是第0个线程。。我读到的值为 009
我是第0个线程。。我读到的值为 011.
...全文
718 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
天乐 2010-03-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sp1234 的回复:]
没有仔细看你的代码。不过要知道,给字符串变量赋值并不是修改它,而是重新创建了新的对象。
[/Quote]

支持sp老大的两个意见

字符串这东西,不管你是否是static的,每次赋值都是新建了一个System.String对象

用起来跟值类型很像

最好别锁它
wuyq11 2010-03-16
  • 打赏
  • 举报
回复
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Thread t = new Thread(() =>
{
Singleton.getInstance();
});
t.Start();
}
Console.Read();
}
public class Singleton
{
private Singleton() { }
private static Singleton instance = null;
private static object obj = new object();
public static Singleton getInstance()
{
Console.WriteLine("线程号:{0}于{1}进入方法", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
lock (obj)
{
if (instance == null)
instance = new Singleton();
Console.WriteLine("线程号:{0}于{1}完成操作", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
return instance;
}

}
}

}
fuadam 2010-03-16
  • 打赏
  • 举报
回复
只有在跨AppDomain的时候才需要对string做lock
cjcgy 2010-03-16
  • 打赏
  • 举报
回复
字符串最好不要lock。。。
尤其是字符串直接用双引号一写的。
容易碰到字符串池的问题。

相同内容的字符串很可能实际上是同一个引用。
calltaotao 2010-03-16
  • 打赏
  • 举报
回复
可是这个lock的对象是static的啊...静态变量只能被初始化一次啊
yedaoq 2010-03-16
  • 打赏
  • 举报
回复
使用lock同步时,应保证lock的是同一个对象。在你的程序里,每次给obj赋值都导致obj指向了一个新对象。这样多个线程以及每个循环之间所lock的对象都不同,因此达不到同步的效果。
  • 打赏
  • 举报
回复
通常,用来lock的变量设计为

private static object obj=new object();

然后就再也不去为这个obj赋值了!
  • 打赏
  • 举报
回复
没有仔细看你的代码。不过要知道,给字符串变量赋值并不是修改它,而是重新创建了新的对象。
平生我自如 2010-03-16
  • 打赏
  • 举报
回复
不会!帮顶一下~~~~~~~~~~~

110,538

社区成员

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

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

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