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


思路:

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

  1. package com.shawearn.test;  
  2.   
  3. /** 
  4.  * 測試多個線程調用同一靜態方法(無靜態變量)時是否有線程安全問題; 
  5.  *  
  6.  * @author Shawearn 
  7.  * 
  8.  */  
  9. public class TestThreadSafe {  
  10.     public static void main(String[] args) {  
  11.   
  12.         // 創建第一個線程,該線程調用 test 方法時會被阻塞 3000 毫秒;  
  13.         new Thread(new Runnable() {  
  14.   
  15.             @Override  
  16.             public void run() {  
  17.                 // TODO Auto-generated method stub  
  18.                 test(1, 1, 3000L);  
  19.             }  
  20.   
  21.         }).start();  
  22.   
  23.         // 創建第二個線程,該線程在調用 test 方法時會被阻塞 1000 毫秒;  
  24.         new Thread(new Runnable() {  
  25.   
  26.             @Override  
  27.             public void run() {  
  28.                 // TODO Auto-generated method stub  
  29.                 test(2, 2, 1000L);  
  30.             }  
  31.   
  32.         }).start();  
  33.   
  34.     }  
  35.   
  36.     /** 
  37.      * 測試方法; 
  38.      *  
  39.      * @param num 傳入的數字; 
  40.      * @param callCount 當前方法被調用的次數; 
  41.      * @param sleepTime 當前方法運行時的阻塞時間,單位為毫秒; 
  42.      */  
  43.     public static void test(int num, int callCount, long sleepTime) {  
  44.         long nowTime = System.currentTimeMillis();  
  45.         int result = 0;  
  46.         try {  
  47.             result = num;  
  48.             Thread.sleep(sleepTime);  
  49.         } catch (InterruptedException e) {  
  50.             // TODO Auto-generated catch block  
  51.             e.printStackTrace();  
  52.         }  
  53.         System.out.println("[" + nowTime + "] 第 " + callCount + " 次調用 result : " + result);  
  54.     }  
  55. }  

第一次運行結果:
  1. [1476725904385] 第 2 次調用 result : 2  
  2. [1476725904385] 第 1 次調用 result : 1  

第二次運行結果:
  1. [1476725950310] 第 2 次調用 result : 2  
  2. [1476725950310] 第 1 次調用 result : 1  

第三次運行結果:
  1. [1476725998017] 第 2 次調用 result : 2  
  2. [1476725998017] 第 1 次調用 result : 1  

實驗結論:

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

 

 

版權聲明:本博文為作者個人原創,轉載請聲明文章來源 http://blog.csdn.net/shawearn1027


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM