我和队友讨论过锁定.NET.他是一个非常聪明的人,在低级和高级编程方面拥有广泛的背景,但他在低级编程方面的经验远远超过我的.无论如何,他认为,如果可能的话,应该避免在预期会处于重负载的关键系统上进行.NET锁定,以避免"僵尸线程"崩溃系统的可能性很小.我经常使用锁定而且我不知道什么是"僵尸线程",所以我问道.我从他的解释中得到的印象是僵尸线程是一个已经终止但仍然保留在某些资源上的线程.他给出了僵尸线程如何破坏系统的一个例子是一个线程在锁定某个对象后开始一些程序,然后在某个时刻终止锁定才能被释放.这种情况有可能使系统崩溃,因为最终,尝试执行该方法将导致所有线程都在等待访问永远不会返回的对象,因为使用锁定对象的线程已经死亡.
我想我得到了这个的要点,但如果我离开基地,请告诉我.这个概念对我来说很有意义.我并不完全相信这是一个可能在.NET中发生的真实场景.我以前从未听说过"僵尸",但我确实认识到,在较低级别深入工作的程序员往往对计算基础(如线程)有更深入的了解.我肯定看到了锁定的价值,然而,我看到许多世界级程序员利用锁定.我也很有能力为自己评估这个,因为我知道这lock(obj)
句话实际上只是语法糖:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
Run Code Online (Sandbox Code Playgroud)
因为Monitor.Enter
并且Monitor.Exit
被标记了extern
.似乎可以想象.NET会做某种处理来保护线程免受可能产生这种影响的系统组件的影响,但这纯粹是推测性的,可能只是基于我从未听说过"僵尸线程"的事实.之前.所以,我希望我能在这里得到一些反馈:
两年多前我问过这个问题.今天发生这种事:
何时在C#中使用Monitor
类或lock
关键字来确保线程安全?
编辑:
到目前为止,答案似乎lock
是对Monitor
课程的一系列调用的简写.锁定电话到底是什么?或者更明确地说,
class LockVsMonitor
{
private readonly object LockObject = new object();
public void DoThreadSafeSomethingWithLock(Action action)
{
lock (LockObject)
{
action.Invoke();
}
}
public void DoThreadSafeSomethingWithMonitor(Action action)
{
// What goes here ?
}
}
Run Code Online (Sandbox Code Playgroud)
更新
谢谢大家的帮助:我发布了另一个问题,作为您提供的一些信息的后续跟进.由于您似乎精通这一领域,我发布了链接:此锁定和管理锁定异常的解决方案有什么问题?
我在网页上有一个链接.当用户单击它时,页面上的小部件应该更新.但是,我正在做一些事情,因为默认功能(导航到不同的页面)发生在事件触发之前.
这就是链接的样子:
<a href="store/cart/" class="update-cart">Update Cart</a>
Run Code Online (Sandbox Code Playgroud)
这就是jQuery的样子:
$('.update-cart').click(function(e) {
e.stopPropagation();
updateCartWidget();
});
Run Code Online (Sandbox Code Playgroud)
问题是什么?
如何lock
在JavaScript中实现与C#相同的东西?
所以,要解释我在想什么简单的用例是:
用户点击按钮B
. B
提出onclick事件.如果B
是在event-state
事件等待B
是在ready-state
传播之前.如果B
处于ready-state
,B
已锁定并设置为event-state
,则事件将传播.事件的传播完成后,B
设置为ready-state
.
我可以看到如何通过添加和删除ready-state
按钮中的类来完成与此相近的操作.但是,问题是用户可以连续两次单击按钮,而不是可以设置变量,因此在某些情况下锁定尝试将失败.
有谁知道如何实现一个不会在JavaScript中失败的锁?
每当我深入了解反射器时,我就会碰到extern
没有光源的方法.我在http://msdn.microsoft.com/en-us/library/e59b22c5(v=vs.80).aspx上阅读了msdn文档.我从那篇文章得到的是extern
必须注入带有修饰符的方法.我将其解释为意味着它的工作方式类似于抽象工厂模式.我也注意到我从未见过非静态的外部方法.静态声明是一个要求(我可以看到这有什么意义)?我还在猜这里,我不确定它是如何运作的.在我看来,编译器必须识别某些缓解处理的属性,但我不知道除了我MethodImplAttribute
和DllImportAttribute
MSDN示例中遇到的属性之外的属性.有人如何利用该extern
属性?它说,在许多情况下,这可以提高性能.另外,我将如何extern
研究类似的方法来源Object.InternalGetEquals()
?
是否有可能在C#中声明一个恒定的Guid?
我明白我可以声明一个static readonly Guid
,但是有一种语法允许我写const Guid
吗?
警告:此代码告诉,请参阅安东尼的评论
哪个更快?
1.
public bool IsValueType<T>(T obj){
return obj is ValueType;
}
Run Code Online (Sandbox Code Playgroud)
2.
public bool IsValueType<T>(T obj){
return obj == null ? false : obj.GetType().IsValueType;
}
Run Code Online (Sandbox Code Playgroud)
3.
public bool IsValueType<T>(T obj){
return default(T) != null;
}
Run Code Online (Sandbox Code Playgroud)
还有别的
Eric Lippert告诉我,我应该"尝试始终使值类型不可变",所以我认为我应该尝试始终使值类型不可变.
但是,我刚刚System.Web.Util.SimpleBitVector32
在System.Web
程序集中找到了这个内部可变结构,这让我觉得必须有一个很好的理由来拥有一个可变结构.我猜他们这样做的原因是因为它在测试中表现得更好,而且他们把它保持在内部以阻止它的误用.然而,这是猜测.
我已经C&P了这个结构的来源.什么是设计决定使用可变结构的合理性?一般来说,这种方法可以获得什么样的好处,什么时候这些好处足以证明潜在的损害?
[Serializable, StructLayout(LayoutKind.Sequential)]
internal struct SimpleBitVector32
{
private int data;
internal SimpleBitVector32(int data)
{
this.data = data;
}
internal int IntegerValue
{
get { return this.data; }
set { this.data = value; }
}
internal bool this[int bit]
{
get {
return ((this.data & bit) == bit);
}
set {
int data = this.data;
if (value) this.data = data | bit;
else this.data = data & ~bit;
}
}
internal int this[int …
Run Code Online (Sandbox Code Playgroud) 术语"资源所有者"是在所定义的OAuth V2.0规范,作为"能够准予访问受保护资源的实体.当资源所有者是人,它被称为最终用户".
我的问题是,什么时候资源所有者不是最终用户?我希望通过可能是真实用例的例子来解释.例如,如果受保护资源是Facebook用户的照片,资源所有者 Facebook或上传照片的Facebook用户是?此外,如果资源所有者(也是一个人)甚至不是正在实施OAuth的应用程序的用户,为什么还要将其视为最终用户?而且,如果Facebook用户是资源所有者,那么Facebook在此交易中扮演什么角色?
我在Google和SO上找到了几个选项的链接,但没有关于现实应用程序中现有实现和用法的大量信息.
我还考虑过使用文档数据库(如RavenDB或MongoDB)和专用的三重存储或RDBMS(如SQL)之间的混合,并扩充数据存储以支持我想要的功能.然而,这可能是相当多的工作,我希望其他人已经完成了它.
三位一体 - 这个是由微软制作的,而且文献听起来很棒,但我找不到下载链接,而且发布页面上写着"Trinity包目前仅用于内部网访问.".
db4o - 这是一个面向对象的数据库,本机支持.NET和Java.它似乎作为图形DB销售,但我不确定"图形"结构/操作是隐式还是显式(或者它是否提供比任何其他文档数据库更多).
TinkerPop - 这个项目看起来就像我正在寻找的,但是github源代码似乎只在Java中.这从graph-database.org SlideShare上讨论.NET版本,但我一直没能找到他们.
CloudGraph - 听起来不错,但似乎不存在.
GiraffeDB - "GiraffeDB是一个功能强大的.NET框架4.0图形数据库系统,能够以高效且易于访问的方式表示复杂的语义""目前正在进行规划".
AllegroGraph 4.7 - 这看起来非常成熟(支持SPARQL和Prolog以及许多客户端接口),但它是封闭源代码.我显然会对一个我没有听说过的闭源项目持怀疑态度.
还有一些看起来非常有前景的Java项目(HyperGraphDB和Neo4j,但我还没有看到任何现有的.NET集成.我并不是完全反对使用Java解决方案并自己做这项工作,但又一次,我更喜欢经过验证的解决方案,可以节省我最多的时间.