线程安全之不安全例子

来源:百度知道 编辑:UC知道 时间:2024/06/07 14:26:41
msdn里总有这句
此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。

1.什么叫线程安全?
2.请举个例说明什么情况下是不安全的?

线程安全指的是当多个线程操作同一个数据段时,用相应的互斥机制,避免数据段中的数据错误。

C#中 非主线程调用 主窗口内控件就是不安全的 。
要用委托和 INVOKE属性来做。

当你用public static声明这个类型的具体实例(对于class来说其实例就是对象)时是线程安全的。其他时候创建的实例就不能保证线程安全。
举例说,如果一个类里包含若干个成员,有的是public static成员,有的不是。那么只有那些poublic static的成员能够保证多个线程访问时,其成员的值(对于引用可以理解为引用对象的指针)是线程安全的。至于这些成员下面的成员是否线程安全则还要看这个类型自己的设计如何。
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。

比如一个 ArrayList 类,在添加一个元素的时候,它可能会有两步来完成:1. 在 Items[Size] 的位置存放此元素;2. 增大 Size 的值。

在单线程运行的情况下,如果 Size = 0,添加一个元素后,此元素在位置 0,而且 Size=1;
而如果是在多线程情况下,比如有两个线程,线程 A 先将元素存放在位置 0。但是此时 CPU 调度线程A暂停,线程 B 得到运行的机会。线程B也向此 ArrayList 添加元素,因为此时 Size 仍然等于 0 (注意哦,我们假设的是添加一个元素是要两个步骤哦,而线程A仅仅完成了步骤1),所以线程B也将元素存放在位置0。然后线程A和线程B都继续运行,都增加 Size 的值。
那好,现在我们来看看 ArrayList 的情况,元素实际上只有一个,存放在位置 0,而 Size 却等于 2。这就是“线程不安全”了,呵呵。

不懂钻懂