前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何在匿名thread子类中保证线程安全

如何在匿名thread子类中保证线程安全

作者头像
FunTester
发布2020-02-17 16:00:56
4660
发布2020-02-17 16:00:56
举报
文章被收录于专栏:FunTester

在做性能测试的过程中,我写了两个虚拟类ThreadLimitTimeCountThreadLimitTimesCount做框架,通过对线程的标记来完成超时请求的记录。旧方法如下:

代码语言:javascript
复制
 @Override
    protected void after() {
        requestMark.addAll(marks);
        marks = new ArrayList<>();
        GCThread.stop();
        synchronized (this.getClass()) {
            if (countDownLatch.getCount() == 0 && requestMark.size() != 0) {
                Save.saveStringList(requestMark, MARK_Path.replace(LONG_Path, EMPTY) + Time.getDate().replace(SPACE_1, CONNECTOR));
                requestMark = new Vector<>();
            }
        }
    }

其中我用了synchronized关键字同步,但是在匿名类的单元测试中出现一个BUG,匿名类中没有实现clone()方法,也不能直接使用深拷贝方法,导致无法直接复制对象,所以我创建了多个功能相同的匿名线程类。问题来了,在代码执行过程中,偶然会出现记录markrequest的文档中出现空内容的形式。

我查询了一些资料,感觉问题出现在synchronized (this.getClass())这个问题了,因为我打印this.getClass()给我的是当前测试类的类名,感觉原因就是匿名类的问题,匿名类相当于多个实现类,synchronized (this.getClass())无法保证多各类对象同时访问这个方法的线程安全。最终,我选择了另外一种方式,就是单独写一个线程安全的save()方法,这样就可以保证所有访问保存方法的线程的安全,将清空记录列表的功能也放在了这个线程安全的方法里了。

代码语言:javascript
复制
    /**
     * 同步save数据,用于匿名类多线程保存测试数据
     *
     * @param data
     * @param name
     */
    public static void saveStringListSync(Collection<String> data, String name) {
        synchronized (Save.class) {
            if (data.isEmpty()) return;
            saveStringList(data, name);
        }
    }

原来虚拟类的方法就变成了如下的样子:

代码语言:javascript
复制
            if (countDownLatch.getCount() == 0 && requestMark.size() != 0) {
                Save.saveStringListSync(requestMark, MARK_Path.replace(LONG_Path, EMPTY) + Time.getDate().replace(SPACE_1, CONNECTOR));
            }

  • 郑重声明:文章首发于公众号“FunTester”,禁止第三方(腾讯云除外)转载、发表。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档