高并发问题抛去架构层面的问题,落实到代码层面就是多线程的问题。多线程的问题主要是线程安全的问题(其他还有活跃性问题,性能问题等)。
那什么是线程安全?下面这个定义来自《Java并发编程实战》,这本书强烈推荐,是几个Java语言的作者合写的,都是并发编程方面的大神。
线程安全指的是:当多个线程访问某个类时,这个类始终都能表现出正确的行为。
正确指的是“所见即所知”,程序执行的结果和你所预想的结果一致。
理解线程安全的概念很重要,所谓线程安全问题,就是处理对象状态的问题。如果要处理的对象是无状态的(不变性),或者可以避免多个线程共享的(线程封闭),那么我们可以放心,这个对象可能是线程安全的。当无法避免,必须要共享这个对象状态给多线程访问时,这时候才用到线程同步的一系列技术。
这个理解放大到架构层面,我们来设计业务层代码时,业务层最好做到无状态,这样就业务层就具备了可伸缩性,可以通过横向扩展平滑应对高并发。
所以我们处理线程安全可以有几个层次:
1. 能否做成无状态的不变对象。无状态是最安全的。
2. 能否线程封闭
3. 采用何种同步技术
我理解为能够“逃避”多线程问题,能逃则逃,实在不行了再来处理。
了解了线程封闭的背景,来说说线程封闭的具体技术和思路
1. 栈封闭
2. ThreadLocal
3. 程序控