rocketmq consumer优雅停机的探索
背景
最近在项目(一个dubbo服务)发布的时候经常报这个错
最近在项目(一个dubbo服务)发布的时候经常报这个错
本文基于jdk 1.8,1.7的实现稍微有所不同,本文不说红黑树部分。
(1)HashMap的数据结构
这个类要从HashMap讲起,HashMap是一个简单的hash表,稍微详细一点的介绍可以在网上查一下资料,或者看我以前写的《java集合总结》。这个集合有一个缺点是线程不安全,也就是说,如果在多线程下同时读写可能会产生意想不到的结果。比如这样:
单例模式大家应该都不陌生,只要写过一些代码的,估计天天用,好处也自然不多说,有些对象创建一个就够了,比如数据库或者网络的连接,创建一个就够了。实现单例模式需要做到:
在java中,关键字synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代Volatile功能)
昨天看一篇文章说保证线程安全有两种方法,一种是加锁,另一种是使用ThreadLocal,所以今天看一下ThreadLocal是怎么样实现的。
打开ThreadLocal源码,发现映入眼帘的是AtomicInteger,虽然早有耳闻,但仍不知道AtomicXXX系列是怎样实现的。于是又打开了AtomicInteger的源码,发现它使用了Unsafe,好吧,我们从Unsafe开始。
几天前我在思考这样一个问题,如果用java的多线程来做一个合力完成的事,例如合并请求,假设前端来了3个请求,到java这一层需要合成一个请求并返回,那么需要启用3个线程去请求,并等所有的结果都返回了再合并一下返回给前端,这该如何去做?
最开始我找到的是Thread.join这个方法。
上一篇文章最后讲到了动态代理,在spring中有个特性也是利用动态代理实现的,那就是面向切面编程(aop)。Spring aop有两种实现方式:一种是spring aop,另一种是aspectj。这两种实现方式的主要区别在于:spring aop采用的是动态织入(运行期期植入),而aspectJ是静态织入(编译期植入)。