高并发下产生大量,随机,唯一的字符串,并输出到文件中

随机的条件比较好实现。
问题的关键是高并发下怎么产生唯一的字符串

1、由于需要判重且数量较大,所以选用Bloom Filter。
BloomFilter的特点是:
如果Bloom Filter判断一条记录不存在,则它一定不存在;
如果Bloom Filter判断一条记录存在,则它可能存在,也可能不存在。
我们只要不存在的记录,所以可以使用Bloom Filter

2、加锁
假设线程A和B同时产生"4InLove"字符串,且通过Bloom Filter判断没有产生过,那么就有可能将重复的两个数据输出到文件中,
所以需要加锁进行判断

以下是关键代码:

//用来判断是否产生过这个字符串
public static boolean putIfNotContain(String str){

        lock.lock();
        boolean flag = false;
        try {
            if(!bloomFilter.mightContain(str)){
                bloomFilter.put(str);
                flag = true;
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
        return flag;
    }

//产生字符串时需要判断
public static String getRandomActivationCode(int length) {
        String code = StringUtils.upperCase(YxStringUtils.randomString(length));
        while (!GenarateUniqueActivationCode.putIfNotContain(code)) {
            code = StringUtils.upperCase(YxStringUtils.randomString(length));
        }
        return code;
    }

转载于:https://www.cnblogs.com/bendantuohai/p/6156133.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值