4

我正在使用TestNG並行運行測試,並且希望小心與助手類和實用程序可能出現的同步問題。據我所知,每個測試都是它自己的對象,由測試運行者透明地創建。因此,我不需要擔心同步任何非靜態的東西,因爲它將是一個在線程中創建的對象,因此對其他人不可見。這應該是一個同步方法嗎?

但是,當我打電話給我寫的這個外部日誌功能時,是否需要同步?線程1進入並設置threadName =「Thread-1」,然後線程2進入並設置SAME threadName變量=「線程-2」,然後thread-1選擇備份並打印出來「--foo |線程2」?我需要使這是一個同步的方法嗎?

public static void log(String _message) { 
    String threadName = Thread.currentThread().getName(); 
    log.println("--" + _message + " | Thread: " + threadName); 
} 

回答

4

你的變量threadName局部變量。對於每個線程將存在一個實例,更準確地說,每個函數調用都會存在一個實例。這意味着他們可以不是互相影響。

+0

太棒了!多數民衆贊成我認爲,感謝閃電(字面上10秒或更少)快速反應! 我假設我不需要擔心同步非靜態方法是否正確?事實上,我唯一需要擔心的是靜態成員變量? – dhackner 2010-08-06 18:23:38

+0

由於非靜態方法也可以訪問共享數據,我會建議您始終使用監視器。 監視器是一個被動類,其目的只是保存變量。監視器必須滿足的一個重要特性是線程安全。我只用信號量來完成這個在Java中,但我想同步方法的工作方式相同。 :) – 2010-08-06 18:30:48

+1

這假定'log.println()'是線程安全的。 – 2010-08-06 18:34:22

1

強調馬庫斯上面說的是什麼:這個日誌字段是什麼?確保它是線程安全的,否則你會看到混合的日誌消息。

相關問題