思路:
使用两个线程调用同一静态方法(该静态方法不引用静态变量)、第一个线程被阻塞的时间大于第二个线程被阻塞的时间,若第一个线程与第二个线程的输出结果相同,则两个线程调用同一静态方法存在线程安全问题,若第一个线程于第二个线程的输出结果不同,则两个线程调用同一静态方法不存在线程安全问题;
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
实验结论:
两个线程调用同一静态方法(该静态方法不引用静态变量)不存在线程安全问题;