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的 没有。 为了方便别人查询 更容易聊了嘛  

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

          

     

     

  • 相关阅读:
    大batch任务对structured streaming任务影响
    spark 集群优化
    linux神器 strace解析
    打个 hadoop RPC的栗子
    netty 入门
    c#硬件对接数值转换
    RabbitMQ 消息队列入门
    RabbitMQ 开发环境安装部署
    Nginx-4.Nginx如何处理请求
    Nginx-3.控制nginx
  • 原文地址:https://www.cnblogs.com/atliwen/p/4786736.html
Copyright © 2011-2022 走看看