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。关于锁这方面了解的不多,查了些资料也不是特别清楚,等以后认识深刻了在来总结下吧。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值