思路:
使用兩個線程調用同一靜態方法(該靜態方法不引用靜態變量)、第一個線程被阻塞的時間大於第二個線程被阻塞的時間,若第一個線程與第二個線程的輸出結果相同,則兩個線程調用同一靜態方法存在線程安全問題,若第一個線程於第二個線程的輸出結果不同,則兩個線程調用同一靜態方法不存在線程安全問題;
package com.shawearn.test;
/**
* 測試多個線程調用同一靜態方法(無靜態變量)時是否有線程安全問題;
*
* @author Shawearn
*
*/
public class TestThreadSafe {
public static void main(String[] args) {
// 創建第一個線程,該線程調用 test 方法時會被阻塞 3000 毫秒;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
test(1, 1, 3000L);
}
}).start();
// 創建第二個線程,該線程在調用 test 方法時會被阻塞 1000 毫秒;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
test(2, 2, 1000L);
}
}).start();
}
/**
* 測試方法;
*
* @param num 傳入的數字;
* @param callCount 當前方法被調用的次數;
* @param sleepTime 當前方法運行時的阻塞時間,單位爲毫秒;
*/
public static void test(int num, int callCount, long sleepTime) {
long nowTime = System.currentTimeMillis();
int result = 0;
try {
result = num;
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("[" + nowTime + "] 第 " + callCount + " 次調用 result : " + result);
}
}
第一次運行結果:
[1476725904385] 第 2 次調用 result : 2
[1476725904385] 第 1 次調用 result : 1
第二次運行結果:
[1476725950310] 第 2 次調用 result : 2
[1476725950310] 第 1 次調用 result : 1
第三次運行結果:
[1476725998017] 第 2 次調用 result : 2
[1476725998017] 第 1 次調用 result : 1
實驗結論:
兩個線程調用同一靜態方法(該靜態方法不引用靜態變量)不存在線程安全問題;