【问题标题】:Are these methods thread safe?这些方法是线程安全的吗?
【发布时间】:2013-12-31 22:09:10
【问题描述】:

我有以下带有通用方法的静态类,我想知道从不同的线程和不同的对象使用它是否安全?我不确定这在幕后是如何工作的,所以解释一下会有所帮助

public static class Serialization
{
    public static byte[] Serialize<T>(T obj)
    {
        using (var ms = new MemoryStream())
        {
            Serializer.SerializeWithLengthPrefix<T>(ms, obj, PrefixStyle.Base128);
            return ms.ToArray();
        }
    }

    public static T DeSerialize<T>(byte[] bytes)
    {
        using (var ms = new MemoryStream(bytes))
        {
            return Serializer.DeserializeWithLengthPrefix<T>(ms, PrefixStyle.Base128);
        }
    }
}

【问题讨论】:

  • 对我来说看起来不错。您有具体问题吗?
  • 没有什么明显的线程不安全的。如果另一个线程在您序列化 obj 时对其进行了修改,那么您将遇到问题,与 bytes 相同,但可能性要小得多。
  • 查看answer here 以获得更长的解释。简而言之:静态方法在默认情况下是线程安全的,只要它们不提交一些多线程巫术。
  • 查看 protobuf 文档,如果 Serializer.SerializeWithLengthPrefixSerializer.DeserializeWithLengthPrefix 是线程安全的,那么 - 是的,您的代码是线程安全的。注意:静态方法应该是线程安全的,按照指南,但是检查:)
  • @PTwr 更正确:静态方法应该是线程安全的,按照惯例。但是,它没有任何默认或自动。但在这种情况下:是的,它们是线程安全的。

标签: c# generics thread-safety protobuf-net


【解决方案1】:

线程的唯一问题是从不同的线程访问同一个对象而没有同步。

如果每个函数只使用读取参数和局部变量,则它们不需要任何同步即可实现线程安全。

【讨论】:

    【解决方案2】:

    它遵循静态方法应该是线程安全的约定,但实际上在 v2 中静态 api 是默认实例上的实例方法的代理:在 protobuf-net 的情况下,它在内部最小化争用点,并同步必要时的内部状态。基本上,该库会竭尽全力做正确的事情,以便您可以编写简单的代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多