問題描述
業(yè)務(wù)有一個需求,我把問題描述一下:
通過代理IP訪問國外某網(wǎng)站N,每個IP對應(yīng)一個固定的網(wǎng)站N的COOKIE,COOKIE有失效時間。
并發(fā)下,取IP是有一定策略的,取到IP之后拿IP對應(yīng)的COOKIE,發(fā)現(xiàn)COOKIE超過失效時間,則調(diào)用腳本訪問網(wǎng)站N獲取一次數(shù)據(jù)。
為了防止多線程取到同一個IP,同時發(fā)現(xiàn)該IP對應(yīng)的COOKIE失效,同時去調(diào)用腳本更新COOKIE,針對IP加了鎖。為了保證鎖的全局唯一性,在鎖前面加了標(biāo)識業(yè)務(wù)的前綴,使用synchronized(lock){...}的方式,鎖住"鎖前綴+IP",這樣保證多線程取到同一個IP,也只有一個IP會更新COOKIE。
不知道這個問題有沒有說清楚,沒說清楚沒關(guān)系,寫一段測試代碼:
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