測試多個線程調用同一靜態方法(無靜態變量)時是否有線程安全問題

思路:

使用兩個線程調用同一靜態方法(該靜態方法不引用靜態變量)、第一個線程被阻塞的時間大於第二個線程被阻塞的時間,若第一個線程與第二個線程的輸出結果相同,則兩個線程調用同一靜態方法存在線程安全問題,若第一個線程於第二個線程的輸出結果不同,則兩個線程調用同一靜態方法不存在線程安全問題;

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

實驗結論:

兩個線程調用同一靜態方法(該靜態方法不引用靜態變量)不存在線程安全問題;



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章