再问一下一个lock的问题。

jianshao810 2013-10-15 04:34:53

public class TestClass
{
public int Column1 { set; get; }
public int Column2 { set; get; }
//private object obj = new object();
object lockindex = 0;


public void TestMethodA(int i)
{
lock (lockindex)
{
while (true)
{
Console.WriteLine(Thread.CurrentThread.Name +":"+ lockindex.GetType());
Thread.Sleep(10); }
//Console.WriteLine(Column1);
}
}

public void TestMethodB()
{
Console.WriteLine("B_Start");
Console.WriteLine("B_End");
}
}


这里 obj 与 lockindex 竟然可以达到相同的作用。
之前一直说不能lock值类型的对象。会每次都装箱,但是现在感觉一点问题也没有。
为什么会这样呢?
...全文
230 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianshao810 2013-10-17
  • 打赏
  • 举报
回复
引用 12 楼 sbwwkmyd 的回复:
[quote=引用 楼主 jianshao810 的回复:]这里 obj 与 lockindex 竟然可以达到相同的作用。 之前一直说不能lock值类型的对象。会每次都装箱,但是现在感觉一点问题也没有。 为什么会这样呢?
1.lockindex不是值类型,赋值的时候已经隐式转换成了object。 2.装箱说的是Monitor.Enter(int),不是lock。[/quote] 谢谢指教。呵呵,那我说的也没错啦
jianshao810 2013-10-16
  • 打赏
  • 举报
回复
引用 9 楼 jianshao810 的回复:
[quote=引用 6 楼 wawd74520 的回复:] lock (this) { //执行操作 DoSomething().... //比如操作静态变量,缓存等 } 防止并发操作,当前用户操作完,下个用户才能再进行操作 一般lock和一个静态型object变量进行配合 先声明一个 private static object symObj = new object(); lock(symObj) { //执行操作 DoSomething().... //比如操作静态变量,缓存等 } 要是 int string 什么的 就不行了
int 编译都通不过的,string 这里可以用。他会引起死锁问题而已。 但是现在是lock 一个装箱类型。唯一可以解析通过的就是 lockindex 已经有了指针,再lock这个引用的时候会自动到堆栈里面找对象。如果每次都lock一个 int 类型不行的。不知道我的解析能通过不。[/quote] 这个解析应该对吧。
showjim 2013-10-16
  • 打赏
  • 举报
回复
引用 楼主 jianshao810 的回复:
这里 obj 与 lockindex 竟然可以达到相同的作用。 之前一直说不能lock值类型的对象。会每次都装箱,但是现在感觉一点问题也没有。 为什么会这样呢?
1.lockindex不是值类型,赋值的时候已经隐式转换成了object。 2.装箱说的是Monitor.Enter(int),不是lock。
失落的神庙 2013-10-15
  • 打赏
  • 举报
回复
应该是把 lock byte[] 也是编译通过的
jianshao810 2013-10-15
  • 打赏
  • 举报
回复
引用 6 楼 wawd74520 的回复:
lock (this) { //执行操作 DoSomething().... //比如操作静态变量,缓存等 } 防止并发操作,当前用户操作完,下个用户才能再进行操作 一般lock和一个静态型object变量进行配合 先声明一个 private static object symObj = new object(); lock(symObj) { //执行操作 DoSomething().... //比如操作静态变量,缓存等 } 要是 int string 什么的 就不行了
int 编译都通不过的,string 这里可以用。他会引起死锁问题而已。 但是现在是lock 一个装箱类型。唯一可以解析通过的就是 lockindex 已经有了指针,再lock这个引用的时候会自动到堆栈里面找对象。如果每次都lock一个 int 类型不行的。不知道我的解析能通过不。
jianshao810 2013-10-15
  • 打赏
  • 举报
回复
引用 7 楼 kiba518 的回复:
lock 通常用于资源共享 同时 又要避免本线程使用资源时 资源被其他线程修改 撸主 怎么用lock玩起了线程同步了
呵呵,线程方面很薄弱,学习一下。他也算是同步的一种了。
kiba518 2013-10-15
  • 打赏
  • 举报
回复
lock 通常用于资源共享 同时 又要避免本线程使用资源时 资源被其他线程修改 撸主 怎么用lock玩起了线程同步了
失落的神庙 2013-10-15
  • 打赏
  • 举报
回复
lock (this) { //执行操作 DoSomething().... //比如操作静态变量,缓存等 } 防止并发操作,当前用户操作完,下个用户才能再进行操作 一般lock和一个静态型object变量进行配合 先声明一个 private static object symObj = new object(); lock(symObj) { //执行操作 DoSomething().... //比如操作静态变量,缓存等 } 要是 int string 什么的 就不行了
失落的神庙 2013-10-15
  • 打赏
  • 举报
回复
引用 3 楼 jianshao810 的回复:
相同效果就是临界区都有作用。lock 起了作用。
不起作用才怪丫
失落的神庙 2013-10-15
  • 打赏
  • 举报
回复
属于 System.Object 这个基类吧
jianshao810 2013-10-15
  • 打赏
  • 举报
回复
相同效果就是临界区都有作用。lock 起了作用。
失落的神庙 2013-10-15
  • 打赏
  • 举报
回复
来看看。。
QuickPai 2013-10-15
  • 打赏
  • 举报
回复
请问你说的达到相同的效果指的是什么?

110,539

社区成员

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

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

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