什么是非线程安全的?

pba*_*aga 15 .net c# language-agnostic multithreading thread-safety

有很多文章和讨论解释了为什么构建线程安全类是好的.据说如果多个线程同时访问例如一个字段,则只会产生一些不良后果.那么,保持线程安全代码的重点是什么?我主要关注.NET,但我认为主要原因不依赖于语言.

例如,.NET静态字段不是线程安全的.如果默认情况下它们是线程安全的,结果会是什么?(无需执行"手动"锁定).使用(实际上默认为)非线程安全有什么好处?

我想到的一件事是性能(更多的是猜测).这是相当直观的,当函数或字段不需要是线程安全的时,它不应该是.但问题是:为什么?线程安全只是您需要实现的额外数量的代码吗?在什么情况下我可以100%确定例如一个字段不会被两个线程同时使用?

And*_*rey 15

编写线程安全代码:

  1. 需要更熟练的开发人员
  2. 更难,消耗更多的编码工作
  3. 更难测试和调试
  4. 通常具有更大的性能成本

但!并不总是需要线程安全的代码.如果您可以确定只有一个线程可以访问某些代码,则上面的列表会变得庞大且不必要的开销.这就像在去邻居城市的时候租一辆面包车,当你有两个人并没有多少行李时.

  • @rook:关于客户试验他们的库,除非明确记录一个方法是线程安全的,否则可以安全地假设它不是.在使用您的课程时,客户承担维护线程安全的责任. (3认同)

Dan*_*ani 11

线程安全带来成本 - 如果同时访问,您需要锁定可能导致问题的字段.

在没有使用线程但在每个cpu周期都很重要时需要高性能的应用程序中,没有理由拥有安全线程类.


Hen*_*man 5

那么,保持非线程安全代码的重点是什么?

成本.就像你假设的那样,通常会有性能上的惩罚.

此外,编写线程安全代码更加困难和耗时.


Ada*_*son 5

线程安全不是"是"或"否"的主张."线程安全"的含义取决于上下文; 这是否意味着"并发读安全,并发写不安全"?这是否意味着应用程序可能只返回陈旧数据而不是崩溃?它可能意味着许多事情.

不使类"线程安全"的主要原因是成本.如果多个线程不能访问该类型,那么投入工作并增加维护成本就没有优势.