解決Lucene的多執行緒併發問題

2021-06-20 09:38:52 字數 1742 閱讀 8514

建立indexwriter的方式:

public class helloworld_2 

}

在lucene程式中,成功以上面的方式建立indexwriter物件以後,會在索引庫中出現乙個鎖檔案,這個鎖檔案是當前這個indexwriter的鎖,如果呼叫indexwriter.close()關閉了鏈結,則將會把這個鎖檔案刪除,也就是說,它釋放了鎖。釋放以後,第二個indexwriter再開啟是沒有問題的。如果不關閉,同時開了兩個或以上的indexwriter,會丟擲乙個異常。導致程式終止。

解決方案就是:通過某種方法保證indexwriter物件只建立乙個。

出現的鎖檔案:

當呼叫indexwriter的close方法後,這個鎖檔案就消失了。

1,多執行緒併發問題模擬

下面程式開啟了兩個indexwriter,都沒有關閉,執行結果丟擲異常:

org.apache.lucene.store.lockobtainfailedexception:lock obtain timed out:nativefslock@d:\itcast2\lucene\indexdir\write.lock

public class multithreadtest 

}

造成錯誤的原因是:indexwriter1建立成功後,持有乙個鎖,這時還沒有關閉indexwriter1,indexwriter2也要來拿這個鎖,而現在這個鎖被indexwriter1持有,indexwriter2無法獲取,所以異常。

只要兩次使用同乙個物件就可以保證沒有併發問題了。這裡通過乙個工具類來提供乙個全域性唯一的indexwriter物件。如下:

/**

* 獲取唯一的indexwriter物件

* 原理:通過靜態**塊static{}在類的生命週期中只載入一次的特點,完成唯一的物件的建立

* @author 許智敏

*/public class luceneutils catch (exception e)

/**當當前執行緒結束時,自動關閉indexwriter,使用runtime物件*/

runtime.getruntime().addshutdownhook(new thread() catch (exception e)

}});

} public static indexwriter getindexwriter()

/**關閉indexwriter

* @throws ioexception

* @throws corruptindexexception */

public static void closeindexwriter() throws exception

}}

然後我們通過這個工具類獲取indexwriter物件,就沒有問題了。

可在控制台看到,這兩個物件是一樣的。

至於indexsearcher,它是從索引庫中獲取資料的,不涉及對索引庫中內容的增刪改,所以indexsearcher沒有併發問題。

多執行緒併發問題

執行緒安全是乙個非常燙手的山芋,因為即使合理運用了鎖,也不一定能保證執行緒安全,這是因為落後的編譯器無法滿足日益增長的併發需求,很多看似無錯的 在優化和併發面前產生了麻煩,可以看下面的 x 0 thread1 thread2 lock lock x x unlock unlock 上面的 看著是沒有...

多執行緒的併發問題?

1 描述 在乙個cpu上同時執行多個執行緒時,會存在多個執行緒競爭cpu資源的問題,但是有時候一段 是不允許打斷,或是出現死鎖的狀態。死鎖 多個執行緒出現了鎖巢狀,形成資源互相等待的狀態,使程式無法繼續執行。2 解決或避免死鎖狀態的方法 引入鎖物件 synchronized 同步 塊 在需要遵循原子...

筆記20200512 多執行緒 併發問題

案例 多個執行緒同時操作同乙個物件 買火車票的例子 多執行緒操作不安全咋處理呢?package com.chengguo.執行緒 多個執行緒同時操作同乙個物件 買火車票的例子 多執行緒操作不安全咋處理呢?public class demo 20200509002 thread implements ...