以下哪个代码更适合多线程访问该函数的情况
public ArrayList CallMe1() { ArrayList al = new ArrayList(); lock(al.SyncRoot) { al.Add("33"); al.Add("45"); return al; } } public ArrayList CallMe2() { ArrayList al = new ArrayList(); Monitor.Enter(al); al.Add("33"); al.Add("45"); Monitor.Exit(al); return al; }
Neil Barnwel.. 9
在这种情况下没有共享状态,因此不需要同步.
但是,假设arraylist 是共享状态,则以下情况适用:
它们都是相同的(锁实现Monitor内部).
大多.
您的第二个版本需要在一个finally
块中释放监视器,否则如果代码抛出异常,锁将永远不会被释放并导致应用程序死锁.
总之,使用第一个版本(lock (...) {... }
)以避免不必要的键入和可能的错误.
在这种情况下没有共享状态,因此不需要同步.
但是,假设arraylist 是共享状态,则以下情况适用:
它们都是相同的(锁实现Monitor内部).
大多.
您的第二个版本需要在一个finally
块中释放监视器,否则如果代码抛出异常,锁将永远不会被释放并导致应用程序死锁.
总之,使用第一个版本(lock (...) {... }
)以避免不必要的键入和可能的错误.
都不是.函数不共享任何数据,因此不需要同步.
都不是.您的所有函数都没有共享状态(只有局部变量),这使得它们本身就是可重入的.无论如何都不需要同步.