问题描述

业务有一个需求,我把问题描述一下:

通过代理IP访问国外某网站N,每个IP对应一个固定的网站N的COOKIE,COOKIE有失效时间。

并发下,取IP是有一定策略的,取到IP之后拿IP对应的COOKIE,发现COOKIE超过失效时间,则调用脚本访问网站N获取一次数据。

为了防止多线程取到同一个IP,同时发现该IP对应的COOKIE失效,同时去调用脚本更新COOKIE,针对IP加了锁。为了保证锁的全局唯一性,在锁前面加了标识业务的前缀,使用synchronized(lock){...}的方式,锁住"锁前缀+IP",这样保证多线程取到同一个IP,也只有一个IP会更新COOKIE。

不知道这个问题有没有说清楚,没说清楚没关系,写一段测试代码:

平面设计培训,网页设计培训,美工培训,游戏开发,动画培训

public class StringThread implements Runnable {    private static final String LOCK_PREFIX = "XXX---";    
    private String ip;    
    public StringThread(String ip) {        this.ip = ip;
    }

    @Override    public void run() {
        String lock = buildLock();        synchronized (lock) {
            System.out.println("[" + JdkUtil.getThreadName() + "]开始运行了");            // 休眠5秒模拟脚本调用
&nbs