rocketmq consumer优雅停机的探索

背景

最近在项目(一个dubbo服务)发布的时候经常报这个错

1
nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is com.alibaba.druid.pool.DataSourceClosedException: dataSource already closed

Mehr lesen

HashMap的resize详解

本文基于jdk 1.8,1.7的实现稍微有所不同,本文不说红黑树部分。

(1)HashMap的数据结构

1
2
3
4
5
6
7
8
9
transient Node<K,V>[] table;
static class Node<K,V> implements Map.Entry<K,V> {
final int hash;
final K key;
V value;
Node<K,V> next;
...
}

Mehr lesen

浅析ConcurrentHashMap

这个类要从HashMap讲起,HashMap是一个简单的hash表,稍微详细一点的介绍可以在网上查一下资料,或者看我以前写的《java集合总结》。这个集合有一个缺点是线程不安全,也就是说,如果在多线程下同时读写可能会产生意想不到的结果。比如这样:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package thread;
import java.util.HashMap;
public class ConcurrentHashMapDemo {
private static HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(1);
public static void main(String[] args) {
Thread thread1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i =0;i < 1000; i++) {
map.put(i, i);
}
System.out.println(map.get(500));
}
});
Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i =1000;i < 2000; i++) {
map.put(i, i);
}
System.out.println(map.get(1500));
}
});
thread1.start();
thread2.start();
}
}

Mehr lesen

从单例模式到序列化

单例模式大家应该都不陌生,只要写过一些代码的,估计天天用,好处也自然不多说,有些对象创建一个就够了,比如数据库或者网络的连接,创建一个就够了。实现单例模式需要做到:

  • 构造方法私有化
  • 静态方法返回实例
  • 当心多线程会创建多个实例

Mehr lesen

synchronized的用法

在java中,关键字synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代Volatile功能)

Mehr lesen

从ThreadLocal到AtomicXXX再到Unsafe

昨天看一篇文章说保证线程安全有两种方法,一种是加锁,另一种是使用ThreadLocal,所以今天看一下ThreadLocal是怎么样实现的。
打开ThreadLocal源码,发现映入眼帘的是AtomicInteger,虽然早有耳闻,但仍不知道AtomicXXX系列是怎样实现的。于是又打开了AtomicInteger的源码,发现它使用了Unsafe,好吧,我们从Unsafe开始。

Mehr lesen

java并发包工具之CountDownLatch/CyclicBarrier/Semaphore

几天前我在思考这样一个问题,如果用java的多线程来做一个合力完成的事,例如合并请求,假设前端来了3个请求,到java这一层需要合成一个请求并返回,那么需要启用3个线程去请求,并等所有的结果都返回了再合并一下返回给前端,这该如何去做?

最开始我找到的是Thread.join这个方法。

Mehr lesen

spring aop之aspectj的使用教程

上一篇文章最后讲到了动态代理,在spring中有个特性也是利用动态代理实现的,那就是面向切面编程(aop)。Spring aop有两种实现方式:一种是spring aop,另一种是aspectj。这两种实现方式的主要区别在于:spring aop采用的是动态织入(运行期期植入),而aspectJ是静态织入(编译期植入)。

Mehr lesen

Java反射机制学习笔记

上一篇《java注解学习笔记》中最后说到了注解的实现主要依赖java的反射机制,那么这一篇主要介绍一下java的反射机制。

什么是java反射机制

java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。

Mehr lesen

java注解学习笔记

什么是Java注解

  • 注解:注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

Mehr lesen