【问题标题】:multi thread safe class多线程安全类
【发布时间】:2011-06-28 21:44:21
【问题描述】:

问题:

A) 使用方法 doA()、doB()、doC() 编写线程安全类。这些方法中的每一个都必须报告方法名称、调用时间和调用线程名称。

B) 编写一个产生 4 个线程的多线程驱动程序,每个线程必须调用每个方法 - doA()、doB()、doC() - 10 次

我假设这意味着 doA()、doB()、doC() 必须是安全的。但是它们都不会改变对象内的共享状态,它们只是读取对象状态,例如方法名称、线程名称和运行时间。那么,我需要同步每个方法吗?对于每个线程内的计数器,它是不共享的。

这里我有点困惑,对象的哪个状态需要保护?

编辑: 我们是否需要一种机制来保证 doA()、doB()、doC() 的运行顺序?我不这么认为。

【问题讨论】:

    标签: java multithreading concurrency


    【解决方案1】:

    从它的声音来看,你的对象根本没有可变状态。没有可变状态的对象通常(不总是,但通常)是线程安全的,没有任何额外的锁定。当然,如果有其他要求确实意味着可变状态,那么答案会有所不同。

    【讨论】:

      【解决方案2】:

      您如何报告信息?如果是控制台或任何其他独立于线程的资源,则有您共享的“状态”。有点。一些写入控制台的机制会缓冲行,所以你可能没有问题,但是在多行上,你必须确保两个不会同时写入它。例如,如果我要打印:

      Thread: A
      Method: doA
      Running Time: 4.6s
      

      然后我想确保另一个线程不会在中途开始。否则你可能会得到这样的结果:

      Thread: A
      Thread: B
      Method: doB
      Running Time: 4.6s
      Method: doA
      Running Time: 3.2s
      

      没那么有用。

      【讨论】:

      • PrintStream 是线程安全的,因此如果您使用 one 调用 System.out.println 进行打印,则可以保证它不会与其他线程可以打印。
      • 或者你可以依赖它自身同步的 PrintStream 的实现细节(至少在 Java 1.6.0_24 中),所以通过同步它你可以对打印方法进行多次调用而无需交错与其他线程。
      • @Esko:我对依赖这样的实现细节持谨慎态度。我认为你最好引入自己的锁。至少在我的工作中,HotSpot 不是我必须支持的唯一 JVM 版本,而且我想其他人也在同一条船上。对于像这样的家庭作业问题,这可能不是问题,但即使在这些情况下,也值得鼓励人们遵循正确的指导方针。
      猜你喜欢
      • 2022-11-21
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2012-03-07
      • 1970-01-01
      • 1970-01-01
      • 2012-06-19
      相关资源
      最近更新 更多