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
  • 相关阅读:
    服务器性能剖析
    事务
    计算机中信息表示
    Git初识
    Redis 概述
    Jedis源码浅析
    Spring 初识
    责任链模式
    观察者模式
    【支付签名失败问题】
  • 原文地址:https://www.cnblogs.com/toSeeMyDream/p/8249999.html
Copyright © 2011-2022 走看看