2012-02-20 29 views

回答

1

不修改任何共享状态。即对于任何一块内存,至多有一个线程可以写入它。这是关于你唯一的选择,如果你想避免全部锁。即使“无锁”编程技术(Interlocked类)使用某种锁,即使它比普通锁便宜一点。

2

这取决于您在该方法内需要做什么,但通常可以使用名为CompareAndSwap的技术。 .NET框架使用CompareExchange函数。无论如何,你必须检查你是否可以用适合CAS的方式表达你的锁。

+0

创建一个Thread方法集合,其Add方法是线程安全的其余方法都不是,但我不必使用任何类型的锁 – ethicallogics 2012-02-20 10:35:13

+0

@ethicallogics您正在使用哪个线程安全集合?其中一些使用显式锁定,一些使用锁定指令,如CompareExchange。 – CodesInChaos 2012-02-20 10:56:44

2

如果你想避免锁定你也想避免共享(可变)状态。函数式编程是一个你没有任何可变状态的范例。您可以在许多编程语言和环境中进行功能风格编程,但举一个例子来说,像Erlang这样的语言特别适合解决这些类型的问题。

1

如何在不使用任何类型的锁的情况下创建线程安全的方法?

要么:不要mdify任何共享状态。基本上这意味着要么(a)你可以使方法静态而不会断开它(因为它没有使用任何实例可用)或(b)所有这些变量都是只读和只读的(所以另一个无法更改它们)或者你可以应对变化。

备选:

OR:你醒了,意识到搞笑ishes可能无法成真。在你修改股份的那一刻,你描述了一种“一种锁定”。这里有无锁机制,但它们在严格的术语(“无锁”)中是“锁定自由”的,而不是在你的术语中(即它们使用一种“锁定”)。技术上来说,自旋锁是无锁的 - 自旋锁是一种锁,但不是真正的锁。

+0

是的,有很多技术像Monitor,InterLocked等,但他们直接或间接使用锁技术。 – ethicallogics 2012-02-20 10:41:48

+0

基本上就是这样。 “某种形式的锁”摧毁了每一种sensibel方法。如何改变食物的味道而不使用某种香料?糟糕 - 你为食物纯粹为口味添加的东西可以被解释为在这种情况下的“某种香料”。 – TomTom 2012-02-20 10:43:12