java 测试单例中的成员方法是否线程安全
来源:互联网 发布:如何做数据透视表 编辑:程序博客网 时间:2024/06/05 18:50
这个是作为单例的类:
public class SingleClass { public String myName = "zero";// 单例的名字,可以通过修改该成员变量,判断单例是否真的只有一个,本例子没做这部分内容判断,感兴趣可以自己改一下这个名字后,输出一下 private static SingleClass self;// 持有自身对象的引用 private SingleClass() { } public static SingleClass getInstance() { if (self == null) {// 双重检查锁 newSelf(); } return self; } private static synchronized/* 双重检查锁 */ SingleClass newSelf() { if (self == null) {// 双重检查锁 self = new SingleClass();// 创建单例 } return self; } public int cale(int x, int y) throws InterruptedException { Thread.sleep((int) (Math.random() * 100));// 随机时间休眠,模拟运算过程的时间长短不一,以造成多线程异步抢夺效果 int z = x + y; Thread.sleep((int) (Math.random() * 100)); return z; }}
这个是测试主程序入口:
public static void main(String[] args) { SingleClass sc = SingleClass.getInstance();// 先获取一下单例,保证初始化的稳定性 for (int i = 0; i < 100; i++) {// 创建100个线程进行异步循环计算 new Thread(new Runnable() { public void run() { while (true) { try { SingleClass sc = SingleClass.getInstance();// 多线程模拟获取使用单例 int z, x, y, r; x = (int) (Math.random() * 100);// 做两个int类型的随机数 y = (int) (Math.random() * 100); z = x + y;// 预期结果 r = sc.cale(x, y);// 利用单例方法进行计算 if (r != z) {// 如果与预期结果不服,则输出 System.out.println("got error" + x + "|" + y + "|" + z + "|" + r + "|"); System.exit(0);// 系统自动退出 } } catch (InterruptedException e1) { e1.printStackTrace(); } } } }).start(); } }
如果程序能够自动退出,就说明多线程下调用单例的方法,是线程不安全的;也就是说会导致线程A中的变量,被线程B改变。
测试结果为:单例中的成员方法,在不涉及成员变量的使用时,是线程安全的。
原因是由于java在调用类对象的方法的时候,是创建的临时存储区域进行的运算,也就是说虽然是一个对象,但是每次调用的方法实际却是多个独立的内存区域。(应该是栈帧的概念)
阅读全文
0 0
- java 测试单例中的成员方法是否线程安全
- java模拟并发请求测试方法是否线程安全
- java 线程安全单例
- Java实现线程安全的单例模式方法
- 线程安全的单例模式是否真的安全
- ios中的线程安全单例实现
- C#中的线程安全单例模式
- servlet 是否线程安全,是否单例模式,怎么解决线程安全的问题
- struts/spring 单例是否线程安全的
- java线程安全的单例模式
- java线程安全的单例模式
- java 线程安全的单例模式
- java线程安全的单例模式
- java单例模式线程安全
- java线程安全的单例模式
- java单例模式(线程安全)
- java 单例模式,线程安全
- java单例模式与线程安全
- UVA11584[Partitioning by Palindromes] 动态规划
- JVM学习笔记
- jd-eclipse反编译插件的在线安装和使用
- JSON的C语言编解码器——cJSON和json-c
- 515
- java 测试单例中的成员方法是否线程安全
- 解决Activity中或fragment时,点击手机返回键无效,无法触发onKeyDown
- Git-项目推送到github和clone到本地(笔记)
- 无法在 DLL SqlServerSpatial110.dll 中找到名为 SetClrFeatureSwitchMap 解决方法
- 学习笔记27-哈弗曼树
- .NET题120道
- SpringBoot-ActiveMq
- IDEA 操作
- sdbtop使用介绍