如果我有一个可以/将在任何给定时间点被多个线程访问的数组,究竟是什么导致它是非线程安全的,以及为确保该数组在大多数情况下是线程安全所采取的步骤情况呢?
我已经在互联网上广泛了解并且发现很少或没有关于这个主题的信息,一切似乎都是特定的场景(例如这个数组,这两个线程通过这两个线程安全地访问,然后开启,等等).我真的希望有人可以回答我在顶部提出的问题,或者是否有人可以指出解释所述项目的好文件.
编辑:在MSDN上查看后,我找到了ArrayList类.使用synchronize方法时,它返回给定列表的线程安全包装器.在列表中设置数据时(即list1 [someNumber] = anotherNumber;)包装器是否自动处理锁定列表,还是需要锁定它?
当两个线程访问完全相同的资源(例如,不是本地副本,但实际上是相同资源的相同副本)时,可能会发生许多事情.在最明显的情况下,如果线程#1正在访问资源而线程#2在读取过程中将其更改,则可能会发生一些不可预测的行为.即使使用像整数这样简单的东西,也可能出现逻辑错误,所以试着想象一下因不正确地使用更复杂的东西而导致的恐怖,比如声明为静态的数据库访问类.
处理此问题的经典方法是锁定敏感资源,这样一次只有一个线程可以使用它.因此,在上面的示例中,线程#1将请求锁定资源并被授予它,然后继续读取它需要读取的内容.线程#2将在读取中间并请求锁定资源,但被拒绝并被告知等待,因为线程#1正在使用它.当线程#1完成时,它会释放锁定,并且线程#2可以继续.
还有其他情况,但这说明了最基本的问题和解决方案之一.在C#中,您可以:
1)使用框架可管理的特定.NET对象(如Scorpion-Prince的SynchronizedCollection链接)
2)使用[MethodImpl(MethodImplOptions.Synchronized)]来指示执行危险操作的特定方法一次只能由一个线程使用
3)使用lock语句隔离正在执行某些潜在危险的特定代码行
什么方法最好是取决于你的情况.
| 归档时间: |
|
| 查看次数: |
8346 次 |
| 最近记录: |