zoukankan      html  css  js  c++  java
  • .NET String.Format 方法 线程安全问题

       

         碰到这个问题 是在和淘宝做信息交互的时候, 接收别人N年前的代码。

         代码逻辑很简单,就是取得信息 数据库查询  响应请求返回结果。

         最近淘宝的人反映说 N多账户使用的是一个单号。理论上来说 是应该每次都不一样的。 最坑爹的是还出现了 数据库中没数据 但是响应结果却有数据了的神奇现象!

         反编译代码,整理后发现 逻辑很简单。

         尼玛 问题找不到怎么办???!!

         第二个反映就是 可能出现并发了。 

         一行一行的排查可能出现的并发的地方。 最后发现  String.Format 很有肯能 。 百度后发现 全都是JAVA 中的 String.Format  会出现线程安全问题。 

         .NET 中怎么样没人说过。。。

         MSDN上 对 String.Format  没有说是否是线程安全的。  但是说 Sring 是 线程安全的!  很容易让人 觉得  String.Format  是也是线程安全的

         反编译  String 类

        

            public static string Format(IFormatProvider provider, string format, params object[] args)
            {
                if ((format == null) || (args == null))
                {
                    throw new ArgumentNullException((format == null) ? "format" : "args");
                }
                StringBuilder builder = new StringBuilder(format.Length + (args.Length * 8));
                builder.AppendFormat(provider, format, args);
                return builder.ToString();
            }
    

         

           String.Format 内部是调用的 StringBuilder 来处理的 字符串。

              所以   String.Format 是线程不安全的。

          

           PS:

                    之所以发个贴  是为了别人查询的时候方便点。     搜索 String.Format 全都是JAVA的 解释。 .NET的 没有。 为了方便别人查询 更容易聊了嘛  

                 反正做开发的 不是掉这坑里,就是还在那个坑里爬着。

          

     

     

  • 相关阅读:
    Spring BeanFactory与FactoryBean的区别及其各自的详细介绍于用法
    解决 vim 报错:the imp module is deprecated in favour of importlib
    SIFT了解,哪些方法可以在现在的AI算法中借鉴?
    CLAHE
    实际算法项目工程上手日志C/C++
    OS X 切换gcc版本
    opencv3.4.2 cmake错误:in-source builds are not allowed
    C++ opencv 计算两张图像的PSNR相似度
    如何在OS X 中使用markdown + latex混合记笔记?
    给anaconda 换源
  • 原文地址:https://www.cnblogs.com/atliwen/p/4786736.html
Copyright © 2011-2022 走看看