static程式碼塊——初始化資料的利器
阿新 • • 發佈:2019-02-17
在專案中用到了kafka來生產訊息、消費訊息,無論是生產還是消費,都需要配置對應的配置檔案,而且需要在專案啟動時,就去讀取配置檔案的內容,並且只執行一次,這裡就要用到static靜態程式碼塊了。
靜態程式碼塊是在虛擬機器載入類(jvm載入類的順序 載入-連線(驗證-準備-解析)-初始化)的時候就執行的,而且只執行一次。如果static程式碼塊有多個,JVM將按照它們在類中出現的先後順序依次執行它們,每個程式碼塊只會被執行一次。
非靜態程式碼塊是在類new一個例項的時候執行,而且是每次new物件例項都會執行(買了《深入理解java虛擬機器》這本書,也沒看完,都是理論,看了幾天就不在看了,以後還得看)。
下面直接把專案中用到的程式碼內容貼出來,留著說不定以後有用。
private static Logger logger = LoggerFactory.getLogger(LogMQMonitorConfig.class); private final static Lock lock = new ReentrantLock(); private static Properties monitorProperties = null; static { init(); } /** * 初始化資料 */ private static void init(){ InputStream inputStream = null; try { lock.lock();//如果被其它資源鎖定,會在此等待鎖釋放,達到暫停的效果 if(monitorProperties == null){ monitorProperties = new Properties(); inputStream = LogMQMonitorConfig.class.getResourceAsStream("/properties/mq-monitor.properties"); monitorProperties.load(inputStream); } } catch (IOException e) { throw new RuntimeException("未找到 kafka 監控的配置檔案:mq-monitor.properties"); } finally { lock.unlock(); if(inputStream!=null){ try { inputStream.close(); } catch (IOException e) { logger.error("mq-monitor.properties檔案輸入流異常", e); } } } }
這是監控初始化的主要程式碼,還有消費者和生產者的,都是一樣的。
這裡為了保證在多執行緒情況下對同一個全域性資源的安全操作,即避免多個執行緒同時訪問或修改同一資源,用到了可重入鎖——ReentrantLock。關於鎖這方面瞭解的不多,查了些資料也不是特別清楚,等以後認識深刻了在來總結下吧。