问题:
A)用方法doA(),doB(),doC()编写一个线程安全类。这些方法中的每一个都必须报告方法名称,调用时间和调用线程名称。
B)编写一个产生4个线程的多线程驱动程序,每个线程必须调用每个方法 - doA(),doB(),doC() - 10次
我假设这意味着doA(),doB(),doC()必须是安全的。但是它们都没有改变对象中的共享状态,它们只是读取对象状态,例如方法名称,线程名称和运行时间。那么,我需要同步每个方法吗?对于每个线程中的计数器,它不是共享的。
我在这里有点困惑,对象的哪个状态需要保护?
编辑: 我们是否需要一种机制来确保doA(),doB(),doC()的运行顺序?我不这么认为。
答案 0 :(得分:3)
从它的声音来看,你的物体根本就没有可变的状态。没有可变状态的对象通常(不总是,但通常)是线程安全的,没有任何额外的锁定。当然,如果有额外的要求确实意味着可变状态,答案就会有所不同。
答案 1 :(得分:3)
您如何报告信息?如果它是一个独立于线程的控制台或任何其他资源,那么就是你的共享“状态”。有点。写入控制台的一些机制将缓冲行,因此您可能没有问题,但是在多行中您必须确保两个不会同时写入它。例如,如果我要打印:
Thread: A
Method: doA
Running Time: 4.6s
然后我想确保另一个线程不会中途启动。否则你可能会得到这样的结论:
Thread: A
Thread: B
Method: doB
Running Time: 4.6s
Method: doA
Running Time: 3.2s
不太有帮助。