思路:
使用兩個線程調用同一靜態方法(該靜態方法不引用靜態變量)、第一個線程被阻塞的時間大於第二個線程被阻塞的時間,若第一個線程與第二個線程的輸出結果相同,則兩個線程調用同一靜態方法存在線程安全問題,若第一個線程於第二個線程的輸出結果不同,則兩個線程調用同一靜態方法不存在線程安全問題;
- 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
實驗結論:
兩個線程調用同一靜態方法(該靜態方法不引用靜態變量)不存在線程安全問題;
版權聲明:本博文為作者個人原創,轉載請聲明文章來源 http://blog.csdn.net/shawearn1027