zoukankan      html  css  js  c++  java
  • 测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题

    思路:

    使用两个线程调用同一静态方法(该静态方法不引用静态变量)、第一个线程被阻塞的时间大于第二个线程被阻塞的时间,若第一个线程与第二个线程的输出结果相同,则两个线程调用同一静态方法存在线程安全问题,若第一个线程于第二个线程的输出结果不同,则两个线程调用同一静态方法不存在线程安全问题;

    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
  • 相关阅读:
    利用pyautogui自动化领取dnf的在线养竹活动的竹子
    idea2019.3版本的安装
    二叉树文本分析
    表达式树的创建
    24点游戏
    二叉树
    队列操作
    HuffmanTree
    两数之和
    面向对象Python
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/8249999.html
Copyright © 2011-2022 走看看