或者我需要锁定才能将同步输出打印到屏幕上?
e.g。
//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()
是通过同步实现的吗?
答案 0 :(得分:1)
Makoto的回答都是真的,但这不是全部真相。 java.io.PrintStream的文档没有提及线程。
>在同一个流上对print(...)
方法重叠调用的行为是不明确的。
您能否容忍代码中未定义的行为?通常,经过充分的测试,答案是肯定的。但是,如果你的代码中的错误可能威胁到人们的生命,威胁到一些大公司的财务状况,威胁到历史性太空任务的成功等等,那么依赖未定义的行为可能会限制职业生涯。< / p>
答案 1 :(得分:0)
由于implementation of println
在该实例上已同步,因此该流几乎不会自我腐败。
但是,如果您有不同的线程打印不同的东西,您可能会看到非确定性行为,因为您认为要打印的内容的顺序不是它们实际的顺序。这是你正在写的流的实际腐败的另一个问题。
答案 2 :(得分:-3)
是的,存在威胁,您将进入竞争条件......部分消息将由一个线程写出。
解决方案是使用log4j之类的记录器之一。请查看此tutorial。