問題描述
業(yè)務有一個需求,我把問題描述一下:
通過代理IP訪問國外某網(wǎng)站N,每個IP對應一個固定的網(wǎng)站N的COOKIE,COOKIE有失效時間。
并發(fā)下,取IP是有一定策略的,取到IP之后拿IP對應的COOKIE,發(fā)現(xiàn)COOKIE超過失效時間,則調(diào)用腳本訪問網(wǎng)站N獲取一次數(shù)據(jù)。
為了防止多線程取到同一個IP,同時發(fā)現(xiàn)該IP對應的COOKIE失效,同時去調(diào)用腳本更新COOKIE,針對IP加了鎖。為了保證鎖的全局唯一性,在鎖前面加了標識業(yè)務的前綴,使用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秒模擬腳本調(diào)用 &nbs