我们如何创建线程安全的方法而不使用任何类型的锁?任何帮助都将被高度修改。感谢不使用任何类型的锁的线程安全方法
回答
这是一个非常高层次的问题,所以这里的高层回答:
不修改任何共享状态。即对于任何一块内存,至多有一个线程可以写入它。这是关于你唯一的选择,如果你想避免全部锁。即使“无锁”编程技术(Interlocked
类)使用某种锁,即使它比普通锁便宜一点。
这取决于您在该方法内需要做什么,但通常可以使用名为CompareAndSwap的技术。 .NET框架使用CompareExchange函数。无论如何,你必须检查你是否可以用适合CAS的方式表达你的锁。
创建一个Thread方法集合,其Add方法是线程安全的其余方法都不是,但我不必使用任何类型的锁 – ethicallogics 2012-02-20 10:35:13
@ethicallogics您正在使用哪个线程安全集合?其中一些使用显式锁定,一些使用锁定指令,如CompareExchange。 – CodesInChaos 2012-02-20 10:56:44
如果你想避免锁定你也想避免共享(可变)状态。函数式编程是一个你没有任何可变状态的范例。您可以在许多编程语言和环境中进行功能风格编程,但举一个例子来说,像Erlang这样的语言特别适合解决这些类型的问题。
如何在不使用任何类型的锁的情况下创建线程安全的方法?
要么:不要mdify任何共享状态。基本上这意味着要么(a)你可以使方法静态而不会断开它(因为它没有使用任何实例可用)或(b)所有这些变量都是只读和只读的(所以另一个无法更改它们)或者你可以应对变化。
备选:
OR:你醒了,意识到搞笑ishes可能无法成真。在你修改股份的那一刻,你描述了一种“一种锁定”。这里有无锁机制,但它们在严格的术语(“无锁”)中是“锁定自由”的,而不是在你的术语中(即它们使用一种“锁定”)。技术上来说,自旋锁是无锁的 - 自旋锁是一种锁,但不是真正的锁。
是的,有很多技术像Monitor,InterLocked等,但他们直接或间接使用锁技术。 – ethicallogics 2012-02-20 10:41:48
基本上就是这样。 “某种形式的锁”摧毁了每一种sensibel方法。如何改变食物的味道而不使用某种香料?糟糕 - 你为食物纯粹为口味添加的东西可以被解释为在这种情况下的“某种香料”。 – TomTom 2012-02-20 10:43:12
- 1. 使用Java,这种类型的安装和线程安全方法调用吗?
- 2. 线程安全的方法
- 3. Java:使用同步方法的类中的线程安全
- 4. 此锁使用线程安全吗?
- 5. 任何确保调用外部方法的方法都是线程安全的?
- 6. 线程安全用更少的锁定
- 7. Ruby类方法是否线程安全?
- 8. 线程安全类和方法参数
- 9. 类方法和线程安全(NSJSONSerialization)
- 10. SqlServer类静态方法 - 线程安全
- 11. 线程安全无锁
- 12. 锁ILIST .NET线程安全
- 13. 如何使SqlDataReader线程安全/转换为线程安全类型
- 14. 是没有任何参数线程安全的静态方法?
- 15. 如何使使用队列线程安全的异步方法
- 16. 如何确定第三方类型实例方法是线程安全的?
- 17. Java方法线程安全
- 18. 线程安全方法?
- 19. popen - 锁还是不线程安全?
- 20. 任何线程不安全mallocs?
- 21. 使android活动方法线程安全
- 22. 线程安全的引用类型,而无需使用同步
- 23. 带线程安全std :: cout的死锁
- 24. 如何使线程安全,而不是线程安全
- 25. QTimer线程安全的方法'isActive()'?
- 26. 线程安全的Dispose方法?
- 27. 静态方法的线程安全
- 28. IntentService的onStartCommand(..)方法线程安全吗?
- 29. 是静态方法线程安全的
- 30. 线程安全的IQueryable扩展方法
什么都不做的方法应该是线程安全的。 – ken2k 2012-02-20 10:18:22