.NET是否可以安全发布和初始化安全?

尚恩

我发现《实践中的Java并发性》一书是编写Java多线程代码的出色指南。我想知道书中描述的一般原理在多大程度上适用于.Net。我对滚动自己的无锁代码不感兴趣–我只想使用扎实,可理解的技术并利用现有的同步和并发API。在此程度上,对我而言,这本书的主要收获是:

  1. 锁定–状态是指同一对象上的锁中的所有其他线程可以看到一个线程中的锁内部所做的更改。毫无疑问,这在.NET中有效,并且足以编写线程安全程序,但是如果我们不能依赖以下机制,它将导致不必要的锁定。
  2. 安全发布–有效的不可变对象(发布后未更改的对象)的最新状态对所有线程可见,只要满足以下条件之一即可。请注意,看到对象引用的最新状态与看到对象本身的最新状态不一定相同–在Java安全发布中,因为事前发生关系具有传递性。
    • 通过所有线程中的锁同步对其引用的访问
    • 通过volatile变量引用
    • 它是从同步或并发集合中发布的。
  3. 具有最终字段(在.NET中为只读)的正确构造的不可变对象的最新状态是线程安全的,无论它们如何发布。

我希望所有这些工作都会给生活带来不必要的困难,但是从我已经准备好的.Net模型(至少是指定的)来看,它是相当薄弱的。有没有人尝试为.NET构建事前模型?我认为这是.Net急需解决的领域。据我所知,没有一本等效的.Net书可以提供相同的“舒适度” –似乎至少部分问题是缺乏针对.NET的明确定义的内存模型。

菲利普·纳瓦拉(Filip navara)

一般概念是相同的。但是,需要考虑Java和.NET内存模型之间的差异。这通常涉及使用Interlocked函数(在Java中),VolatileRead / VolatileWrite显式内存屏障

为.NET指定了两种内存模型。.NET Framework ECMA标准的第12节,分区I中指定的弱内存模型。实际上,更强大的内存模型是由.NET Framework运行时实现的。乔·达菲Joe Duffy)描述了另一种定义IKVM.NET博客描述了一种。NET内存模型与Java有所不同的实际情况

关于您的观点:

  1. 锁定的工作方式与Java中的锁定方式相同。

  2. 安全发布-前两个方案(锁和volatile)的工作方式与Java对应方案相同。

    .NET中不推荐使用同步集合,但是它们在内部使用了锁定,因此它们的工作方式与访问被锁定的方式完全相同。

    作为.NET 3.5的一部分添加的并发集合在内部使用无锁技术,因此它们应在不同线程之间保持内存一致性。我不确定它们是否与内存一致。

  3. 根据定义,不可变对象是线程安全的。一旦构造了一个不变的对象,就不能再对其进行修改。创建它的线程是唯一可以在缓存中拥有其副本的线程。发布后,所有其他线程将获得最新副本,并且保证此副本不会更改。因此,唯一的痛点就是出版本身。您仍然需要注意安全发布,以免创建不可变对象的两个实例,但是从任何线程访问这些实例时,每个实例都是线程安全的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在c ++ 11中,您是否可以始终(安全)用空的初始化程序替换memset()初始化?

在其初始化程序中引用正在初始化的结构是否安全?

ExecutorService的线程安全静态初始化

赋值与初始化期间的类型安全

这是初始化安全吗?

安全初始化空引用

线程安全的延迟初始化

Spring安全初始化失败

初始化SAM(安全访问模块)

静态初始化的不安全调用的线程安全

是否可以使用属性初始化.NET类型?

可以安全地读取C中未初始化的自动volatile变量吗?

我可以在using语句中安全地使用对象初始化程序吗?

C ++标准是否保证统一初始化是异常安全的?

从linux信号处理程序初始化c ++ 11函数静态变量是否安全?

使用** kwargs初始化类是否存在安全问题?

从本地原始指针初始化 std::unique_ptr 是否安全?

C ++:是否使用IIFE线程安全初始化静态局部变量?

使用由Filewriter线程初始化的bufferwriter写入文件是否安全?

使用Default()赋值在Delphi中初始化记录变量是否安全?

使用nil vars初始化惰性变量是否安全(或良好的编程风格)?

无锁和无等待的线程安全延迟初始化

在Objective-C中初始化和使用线程安全静态对象

如何安全地实现“使用未初始化的内存以获得乐趣和收益”?

未来变量和空安全:不可为空的实例字段“通知”必须被初始化

安全地在monticello包中声明和初始化全局变量?

更改Internet Explorer的安全设置(初始化和未编写ActiveX控件脚本...)

是否可以递归初始化数组?

是否可以初始化库?