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