代码之家  ›  专栏  ›  技术社区  ›  olivier57

来自同一实例的字段保留值

  •  0
  • olivier57  · 技术社区  · 7 年前

    事实上,它似乎不是这样工作的,每个线程似乎都保留了自己的值,线程一仍然具有db1值,线程二仍然具有db2值。这怎么可能?当我理解来自同一个类的不同实例的字段共享相同的值时,我错了吗?

    感谢您的友好和熟练的解释

    奥利弗

    public class Context
    {
        public string host; 
        public string port;
        public string user;
        public string pwd;
        public string dbname;
    ...
    public Context(string db) {// Each thread is launched with a different database name
            try { 
            var rep = string.Format(@"D:\Bd\{0}\params\config.txt",db); // one file for each thread
            if (File.Exists(rep)) {
                var dic = File.ReadAllLines(rep)
                  .Select(l => l.Split(new[] { '=' }))
                  .ToDictionary(s => s[0].Trim(), s => s[1].Trim());
                host = dic["host"];
                port = dic["port"];
                user = dic["user"];
                pwd = dic["pwd"];
                dbname = db;
    ...
    Thread thThd1 = new Thread(startthd1);
    thThd1.Start();
    
    public static void startthd1() {
       Context ncontext = new Context("db1");
       Chkthd gth = new Chk(ncontext);
        }
    
    Thread thThd2 = new Thread(startthd2);
    thThd2.Start();
    
    public static void startthd2() {
       Context ncontext = new Context("db2");
       Chkthd gth = new Chk(ncontext);
        }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   camelCase    7 年前

    给定问题中的示例代码,没有理由期望一个线程覆盖另一个线程的字段。当该代码执行时,创建了两个新线程,这些线程独立并同时执行文件I-O,读取“db1”和“dn2”文件路径。

    如果在“Chkthd gth=new Chk(ncontext);”上放置断点startthd1()和startthd2()中的语句您应该期望两个线程同时在这些语句处停止,并且每个方法中的局部变量在从两个文件读取时保存不同的数据。

    Chk gth1 = ReadFileData( "db1" );
    Chk gth2 = ReadFileData( "db2" );
    
    public static Chkthd ReadFileData( string dbName ) {
       Context ncontext = new Context("db2");
       return new Chk(ncontext);
        }