public boolean addKeyword(KeywordItem item) { if (item == null) { return false; } // 存在正在處理的key值則 wait while(lock.contains(item.getKeyword())){ synchronized (lock) { try { logger.info("{}: Wait for other UpKeyword...", item.getKeyword()); lock.wait(); } catch (InterruptedException e) { logger.warn("addKeyword wait: {}", e.getMessage()); } } } //加到鎖集 lock.add(item.getKeyword()); // 首先查詢該主詞全部的相關詞條 KeywordItemRoot root = queryKeywordItemRoot(item); // 添加該詞 root.addKeywordItem(item); // 遍歷該詞的同義詞 String[] sameKeywords = item.getSameKeywords(); if (sameKeywords != null) { // 遍歷同義詞 for (String sk : sameKeywords) { if (StringUtils.isNotBlank(sk)) { // 修改同義詞key,其餘不變 item.setKey(Utils.keyword2Key(sk)); // 添加同義詞 root.addKeywordItem(item); } } } // 刪除該詞在Redis已有的同義詞(oldSameKeywords) if (item.getDownKeywords() != null) { DeleteKeyword deleteKeyword = deleteKeyword(item.getKeyword(), item.getDownKeywords(), item.getRandom()); logger.info(deleteKeyword.toString()); } // 將root(該主詞和其餘相關詞條)寫入Redis緩存 boolean save = saveKeywordItemRoot(root); //處理完後, 喚醒正在wait的線程 synchronized (lock) { lock.remove(item.getKeyword()); lock.notifyAll(); } return save;
上面代碼是從項目當中摘抄的一段代碼,一開始是沒有wait和notify的,後來因爲出如今同時
修改redis的List數據時,出現不一致現象時,才改進了加入同步機制。