思路:

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

  1. package com.shawearn.test;
  2. /**
  3. * 测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题;
  4. *
  5. * @author Shawearn
  6. *
  7. */
  8. public class TestThreadSafe {
  9. public static void main(String[] args) {
  10. // 创建第一个线程,该线程调用 test 方法时会被阻塞 3000 毫秒;
  11. new Thread(new Runnable() {
  12. @Override
  13. public void run() {
  14. // TODO Auto-generated method stub
  15. test(1, 1, 3000L);
  16. }
  17. }).start();
  18. // 创建第二个线程,该线程在调用 test 方法时会被阻塞 1000 毫秒;
  19. new Thread(new Runnable() {
  20. @Override
  21. public void run() {
  22. // TODO Auto-generated method stub
  23. test(2, 2, 1000L);
  24. }
  25. }).start();
  26. }
  27. /**
  28. * 测试方法;
  29. *
  30. * @param num 传入的数字;
  31. * @param callCount 当前方法被调用的次数;
  32. * @param sleepTime 当前方法运行时的阻塞时间,单位为毫秒;
  33. */
  34. public static void test(int num, int callCount, long sleepTime) {
  35. long nowTime = System.currentTimeMillis();
  36. int result = 0;
  37. try {
  38. result = num;
  39. Thread.sleep(sleepTime);
  40. } catch (InterruptedException e) {
  41. // TODO Auto-generated catch block
  42. e.printStackTrace();
  43. }
  44. System.out.println("[" + nowTime + "] 第 " + callCount + " 次调用 result : " + result);
  45. }
  46. }

第一次运行结果:

  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

转载于:https://www.cnblogs.com/toSeeMyDream/p/8249999.html

测试多个线程调用同一静态方法(无静态变量)时是否有线程安全问题相关推荐

  1. java调用类中的静态变量时类中静态代码块什么情况会执行以及类的初始化问题?

    类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载.验证.准备.解析.初始化.使用和卸载七个阶段. 类初始化是类加载过程的最后一个阶段,到初始化阶段,才真正开始执行类中的Jav ...

  2. Java 静态类、静态方法和静态变量

    转载自Java 静态类.静态方法和静态变量 Java 静态类.静态方法和静态变量 static 是Java中的一个关键字,我们不能声明普通外层类或者包为静态的.static用于下面四种情况. 1.静态 ...

  3. java中virtual关键字_浅谈virtual、abstract方法和静态方法、静态变量理解

    说点对这几个容易混淆的词的理解: 1.c++中的virtual方法的 virtual关键字主要是防止继承中重复继承父类的同一个方法而设置的标识. 2.virtual与abstract关键字的不同之处在 ...

  4. java:静态方法,静态变量,实例方法,实例变量的关系 ----李雪

    下面的例子可以解释这几个的关系 public class Test { int a= 8; static int b = 10; Test(){ } //静态方法 public static void ...

  5. 静态方法 和静态变量——Java

    什么是静态方法--也叫类方法 当一个方法前有static时此方法就是一个静态方法.静态方法可以直接通过类名调用: 类变量和类方法 类变量(也叫静态变量,由static修饰的变量:)也叫静态属性:可以被 ...

  6. java static 变量存在哪_Java中的静态方法和静态变量存储在哪里?

    小编典典 静态方法(实际上是所有方法)以及静态变量都存储在PermGen堆的部分中,因为它们是反射数据(与类相关的数据,而不与实例相关的数据)的一部分. 更新说明: 请注意,只有变量及其技术值(原始或 ...

  7. java 静态变量 存储_Java中存储的静态方法和静态变量在哪里?

    静态方法(实际上所有方法)以及静态变量都存储在PermGen部分,因为它们是反射数据的一部分(类相关数据,而不是与实例相关的). 需要澄清的最新情况: 注意,只有变量及其技术值(原语或引用)存储在Pe ...

  8. 静态类、静态方法、静态变量

    一.静态类 1.如果一个类要被声明为static,只有一种情况,就是静态内部类.在外部声明,编译期会报错. 2.静态类只能访问静态变量或者静态方法 3.静态内部类可以声明普通变量和方法,也可以声明静态 ...

  9. java静态代码块、静态方法、静态变量、构造代码块、普通代码块、成员变量执行顺序

    package smartt.styy.auth.model.voRsp;public class Test {static {String test5="555";//局部变量t ...

最新文章

  1. logo语言linux,用 screenfetch 和 linux_logo 显示带有酷炫 Linux 标志的基本硬件信息
  2. es配置中防止脑裂的配置
  3. 与年轻人的“要疯”五年,安踏如何保持新鲜感与吸引力?
  4. Java异常处理throws/throw
  5. new ext.toolbar控制按钮间距_新闻速递 | APT携新品金属按钮亮相宝博会,圈粉无数!...
  6. 关于三层交换机的智能流技术
  7. julia :谈循还,row 与 col who first?
  8. 小甲鱼c语言_Tip:一起做一个平平无奇的程序小天才吧
  9. 好用的码字软件,年入百万的大神作家们都在用
  10. java定时器timer 取消_JAVA定时器Timer的使用
  11. 设计一个算法,通过一趟遍历确定长度为n的但链表的中值的最大的节点
  12. WIFI智能电源插座是怎么连上路由器的?
  13. C++11之decltype
  14. 用事实说话,我们的数据库应选择RAID几?
  15. linux drm 源码,Linux DRM那些事-内核代码
  16. Intouch学习笔记—新建工程
  17. CCTV与西方媒体的区别!句句发人深思...^^
  18. 当WHERE子句、GROUP BY子句和HAVING子句同时出现在一个查询中时,SQL的执行顺序
  19. 艾美捷ALC-0159基本参数文献参考
  20. 大势智慧与华为云联合打造全国首个云原生城市智能中枢时空计算服务

热门文章

  1. Zookeeper 安装
  2. 移动端事件 、zepto移动端事件
  3. Linux内核补丁升级
  4. 前端笔记——获取url里面的参数值
  5. 随着通信和编程,它是一门艺术系列3(沟通的目的)
  6. Linux多线程实践(8) --Posix条件变量解决生产者消费者问题
  7. 利用iframe与Response.Flush实现进度展示效果
  8. 面试题:接口和抽象类的区别
  9. html如何让左右字段不能编辑,HTML中让表单input等文本框为只读不可编辑的方法...
  10. linux 内存日志,性能优化:使用ramlog将日志文件转移到内存中