还是需要锁才能将同步输出打印到屏幕上?
例如:
//Main
public static void main(String[] args) {
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
Thread thread1 = new Thread(myThread1);
Thread thread2 = new Thread(myThread2);
thread1.start();
thread2.start();
}
//Custom thread
public class MyThread() {
public void run() {
System.out.println("Is this method a shared resource that needs to be locked?");
}
}
上述情况会否受到种族情况的影响?或者System.out.println()
是用同步实现的?
发布于 2014-09-27 21:26:09
由于println
在该实例上是同步的,因此几乎不可能发生流自损坏的情况。
但是,如果您有不同的线程打印不同的东西,那么您可能会看到不确定的行为,因为您认为要打印的事物的顺序并不是它们实际的顺序。这是一个单独的关注,真正的腐败,你要写的流。
发布于 2014-09-28 12:43:08
Makoto的回答都是正确的,但这并不是全部的事实。java.io.PrintStream的文档没有提到线程。在同一流上对print(...)
方法的重叠调用的行为是未定义的。
您能容忍代码中未定义的行为吗?通常情况下,经过充分的测试,答案是肯定的。但是,如果代码中的一个bug可能威胁到人们的生命,威胁到某家大公司的财务状况,威胁到一次历史性太空任务的成功,那么依赖不明确的行为可能是一种职业限制。
发布于 2014-09-27 21:17:06
是的,有个威胁说你会进入比赛状态.部分消息将由一个线程写出。
解决方案是使用像log4j这样的记录器。看看这个教程。
https://stackoverflow.com/questions/26078825
复制相似问题