假设我想使用 .Net Framework
中的非线程安全类(文档指出它不是线程安全的)。有时我从一个线程更改 Property X
的值,有时从另一个线程更改,但我从不同时从两个线程访问它。有时我从一个线程调用 Method Y
,有时从另一个线程调用,但绝不会同时调用。
这是否意味着我以线程安全的方式使用该类,而文档说明它不是线程安全的不再与我的情况相关?
如果答案是否定的:我是否可以在同一个线程中执行与特定对象相关的所有操作 - 即创建它并始终在同一个线程(但不是 GUI 线程)中调用其成员?如果是这样,我该怎么做? (如果相关,它是一个 WPF 应用程序)。
不,它不是线程安全的。作为一般规则,您不应该在没有某种同步的情况下编写多线程代码。在您的第一个示例中,即使您以某种方式设法确保永远不会同时进行修改/读取,仍然存在缓存值和指令重新排序的问题。
例如,CPU 将值缓存到寄存器中,您在一个线程上更新它,从另一个线程读取它。如果第二个缓存了它,它就不会去 RAM 中获取它,也看不到更新后的值。
看看这篇很棒的帖子,了解更多信息和编写无锁多线程代码的问题 link .它很好地解释了 CPU、编译器和 CLI 字节码编译器如何重新排序指令。
我是一名优秀的程序员,十分优秀!