1. 程式人生 > >static程式碼塊——初始化資料的利器

static程式碼塊——初始化資料的利器

在專案中用到了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。關於鎖這方面瞭解的不多,查了些資料也不是特別清楚,等以後認識深刻了在來總結下吧。