简介
在处理并发问题时,使用锁技术可能会导致性能问题,所以无锁并发在高并发环境中会普遍采用。
线程封闭技术是实现无锁并发的手段之一。如果共享的对象仅限制在同一个线程内访问,将自动实现线程安全,这种技术就叫线程封闭技术。在java的生态系统里,很多框架都可能采用了这种线程封闭技术,以达到高并发的安全及高性能。
java生态中线程封闭技术的体现及避坑
- ThreadLocal类
使用经典案例:JDBC的Connection对象。每当从数据库连接池中获取一个数据库连接时,获得的数据库连接就只能被当前线程使用,即当前数据库连接绑定给当前线程,当前线程数据库操作完,释放数据库连接,即解除数据库连接与当前线程的绑定,归还给数据库连接池,以供其它线程使用。
避坑:及时清理ThreadLocal持有的当前线程对象,避免内存泄露,发生OOM(其它坑可以参考之前的博文介绍)。
- 栈封闭实现
java语言的实现是基于栈的。栈是线程独有的内存区域,栈上分配的局部变量是当前线程所拥有,自带线程安全性。
避坑:栈内的变量不要逸出,容易导致并发安全问题。
- Ad-hoc线程封闭的实现
Ad-hoc线程封闭是指:维护线程封闭的职责完全由程序实现来承担。
比较经典的实现如:redis的单线程模型、Netty4的线程模型、Swing通过将可视化组件和数据模型对象封闭到Swing的事件分发线程中等。