Java的wait和notify應用

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數據時,出現不一致現象時,才改進了加入同步機制。
相關文章
相關標籤/搜索