线程安全方法,不使用任何类型的锁
本文关键字:任何 类型 安全 方法 线程 | 更新日期: 2023-09-27 18:25:05
如何在不使用任何类型的锁的情况下创建线程安全的方法?任何帮助都将被高度重视。感谢
这取决于您需要在方法内部做什么,但通常可以使用名为CompareAndSwap的技术。.NET框架使用CompareExchange函数。在任何情况下,您都必须检查是否可以以适合CAS的方式表达您的锁。
如果您想避免锁定,还需要避免共享(可变)状态。函数式编程是一种没有任何可变状态的范式。您可以在许多编程语言和环境中进行函数式编程,但举个例子,像Erlang这样的语言特别适合解决这类问题。
这是一个非常高级的问题,所以这里有一个高级的答案:
http://en.wikipedia.org/wiki/Reentrancy_(计算)
不要修改任何共享状态。也就是说,对于任何一块内存,最多有一个线程可以写入。如果你想避免所有锁,这是你唯一的选择。
即使是"无锁"编程技术(Interlocked
类)也使用某种锁,即使它比普通锁便宜一点。
我们如何在不使用任何类型的锁的情况下创建线程安全的方法?
要么:不要mdify任何共享状态。基本上,这意味着(a)你可以在不破坏方法的情况下使其静态(因为它没有使用任何实例变量),或者(b)所有这些变量都是只读的AND READONLY(所以另一个方法不能更改它们),或者你可以处理更改。
备选方案:
或者:你醒来后意识到有趣的惩罚可能不会成真。你修改股票状态的那一刻,就意味着"一种锁定"。有一些无锁的mchanism,但它们在严格术语中是"无锁的"("无锁"),而不是在你的术语中(即它们使用一种锁)。从技术上讲,旋转锁是无锁的——旋转锁是一种锁,但不是真正的锁。