9
|
No Refunds No Returns · 技术社区 · 15 年前 |
![]() |
1
7
这是标准 double check locking 问题它在这里的实现方式是不安全的,可能会导致各种问题——如果字典的内部状态搞砸了,那么在第一次检查中可能会出现崩溃。
一个简单的解决方案是将第一张支票也放在锁下。这样做的一个问题是,这会成为一个全局锁,在web环境中,在重载情况下,它会成为一个严重的瓶颈。 如果我们谈论的是.NET环境,那么可以通过借助ASP.NET同步机制来解决这个问题。 这是我在美国的做法 NDjango rendering engine :我为每个渲染线程保留一个全局字典和一个字典。当一个请求到来时,我首先检查本地字典——这个检查不需要同步,如果有东西,我就接受它 如果不是,我在全局字典上同步,检查它是否存在,如果存在,将它添加到我的线程字典并释放锁。如果它不在全局字典中,我会在仍然处于锁定状态时首先将它添加到那里。 |
![]() |
2
3
锁在没有竞争的情况下非常便宜。不利的一面是,这意味着偶尔你会阻塞
每个人
在您创建新项目的整个过程中
我建议您使用上面的代码,但对其进行分析,看看它是否足够快。如果你真的需要“只有当另一个线程已经在创建相同的东西时才会阻塞”,那么请让我们知道,我们将看看我们能做些什么。。。
编辑:好的,这通常很有趣,所以这里是“仅阻止其他线程请求相同项目”的第一步。
呸! 那是 完全地 未经测试,尤其是在创建线程时遇到异常时,它的形状或形式都不可靠。。。但我认为这通常是正确的想法:) |
![]() |
3
2
如果您希望避免阻塞不相关的线程,那么就需要进行额外的工作(并且只有当您分析并发现简单代码的性能不可接受时,才需要进行额外的工作)。我建议使用异步创建
编辑 这个问题困扰着我,超出了我的预期,所以我根据这个一般模式设计了一个更健壮的解决方案。你可以找到它 here |
![]() |
4
1
IMHO,如果这段代码是从多个线程同时调用的,建议检查两次。
(但是:我不确定你是否能安全地打电话给我
如果您只是想避免创建但未使用的东西,只需在锁定块中创建它:
|
![]() |
5
0
如果正确使用,.NET锁,通常会非常有效,我相信在这种情况下,您最好这样做:
|
![]() |
6
0
我希望在给出这个答案时不要太天真。但是我要做的是,因为创建Thingyes非常昂贵,将添加一个空值的键。是这样的
我匆忙修改了你的代码,所以没有做任何测试。
|
![]() |
7
0
您可能会以牺牲内存为代价购买一点速度效率。如果您创建一个 不变的 数组,列出所有已创建的内容并使用静态变量引用该数组,然后可以检查任何锁之外的内容是否存在,因为不可变数组始终是线程安全的。然后,当添加新的Thingy时,您可以使用附加的Thingy创建一个新数组,并在一个(原子)集合操作中替换它(在静态变量中)。由于比赛条件的原因,可能会错过一些新的东西,但程序不应该失败。这只意味着在极少数情况下会制作额外的复制品。
|
|
Robert King · Unity C#语法问题-转换位置 1 年前 |
![]() |
JBryanB · 如何从基本抽象类访问类属性 1 年前 |
|
law · 检查答案按钮的输入字符串格式不正确 2 年前 |
![]() |
i_sniff_ket · 在unity之外使用unity类 2 年前 |