C# 加锁问题

MikeAlyosha 2019-03-15 10:07:51
伪代码:
Class A
{
方法:读写abc;
}
Main()
{
线程1开启;
线程2开启;
}
线程1()
{
A a1=new A();
a1.方法
A a2=new A();
a2.方法
}
线程2()
{
A a1=new A();
a1.方法
A a2=new A();
a2.方法
}

问题:
1.以上代码 能否直接在Class A 的方法里读写abc处加锁,如果可以,加lock(this)还是怎么加?(我的理解:实例化不同的a1 a2,就是不同的东西,那么在A类里加锁,就应该是不同的锁,所以会失败,不能在类里面加。或者在类里面加静态锁,但怎么加?)
2.如果不行 应该怎么加锁 最简洁 并且保证两个线程都可以安全读写abc。是在main里面定义锁,还是在main这个类里定义锁,定义成什么类型的锁。
...全文
614 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jx315425246 2019-03-16
  • 打赏
  • 举报
回复
是线程的同步与互斥,可以考虑以下几个方面解决
1、使用 ManualResetEvent 类,set 阻塞 ,Reset 释放阻塞。
2、锁 lock( object) { “语句” } 只有一个线和执行完 “语句”释放后,另一个线程才能执行“语句”
3、互斥锁 Mutex,WaitOne 启用互斥,等待释放, ReleaseMutex,解除互斥,释放
  • 打赏
  • 举报
回复
哦,定义为 internal 或者 private(假设只有当前类型的对象访问)都是可以的。定义为 public 的 Flag 信号对象,虽然比使用
lock(typeof(A))
{
......
}
这类代码更好一点,但是也仍然容易被“意外使用”。
  • 打赏
  • 举报
回复
改一下名字:
Class A
{
  public static objectFlag = new object();
 
 方法:读写abc;
}
实际上 Static 的变量声明的位置,来自于你的设计协议。并没有一定之归,而是看你业务逻辑如何解释。代码是最低级的东西,代码从属于业务设计;而不是用代码来指导业务设计。
  • 打赏
  • 举报
回复
引用 楼主 MikeAlyosha 的回复:
、或者在类里面加静态锁,但怎么加?
可以声明
Class A
{
  public static object = new object();

 方法:读写abc;
}
zhuowp 2019-03-15
  • 打赏
  • 举报
回复
考虑把A做成单例,就可以在读写abc处加锁了。

如果不能把A做成单例,考虑把读写abc的方法提出来做成一个单例也行。

不然就只能每次调用的时候用一个全局的实例作为锁,感觉这样不太好。
牧歌ing 2019-03-15
  • 打赏
  • 举报
回复

object obj=new object();
A _a;
public _A
{
get{
if(_a==null)
{
lock(obj)
{
_a=new A();
}
}
}
return _a;
}

110,533

社区成员

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

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

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