线程封闭背后设计思想

整理自聊聊高并发(二)结合实例说说线程封闭和背后的设计思想

高并发问题简述

  1. 定义: 来自《java并发变成实战》的定义。线程安全指的是多个线程访问某个类时,这个类始终能表现正确行为。
我的理解是线程安全问题就是多个线程同时操作一个数据,
导致每个线程在读取并操作期间数据可能会被其它线程篡改,
即不能表现正确行为。
而栈空间(方法栈)的数据是线程私有的,所以只有类有这个问题。
  1. 思路: 线程安全问题,就是对象状态问题。如果对象无状态(不变性,操作前后一样。),或者避免多个线程共享,那就是线程安全的。只有对象不可避免要被多个线程操作时才会有多线程问题。所以业务代码尽量做到无状态。
思考流程
1. 能否做成无状态的不变对象
2. 能否线程封闭,不让其他线程操作
3. 实在需要多线程操作,那么采用什么同步技术

线程封闭技术

  1. 栈封闭: 多使用局部变量,局部变量属于方法,方法属于栈,栈属于本线程。
  2. ThreadLocal: 限制其他线程访问的全局变量。本质是一个Map,每个线程只能操作自己作为key下的值。
  3. 程序控制线程封闭: 思想,把处理对象状态的代码放到一个线程中。例子:NettyEventLoop被设计成一个线程池(工作线程+任务队列)。请求被插入任务队列,工作线程再一个个取。这样保证了请求有序处理。
思路:
1. 把用户状态相关代码放到一个队列中,由一个线程处理。
2. 考虑是否隔离用户之间状态,及一个用户一个任务队列还是多个用户使用一个。

一般设计

1. 有界任务队列和不限个数的工作线程,任务队列有界保证不会内存被一直加入的请求撑爆。不限个数的工作线程保证任务队列的请求都能被相应,而不至于以为工作线程的速度慢而产生积压。
2. 线程请求尽量快,尽量不超过100ms
3. 单线程处理时间由于任务大而耗时可以拆解成小任务多次执行
4. 小任务还是慢则可以使用线程,异步处理,然后使用线程定时查看状态或者回调函数的形式。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32
  • 高并发问题抛去架构层面的问题,落实到代码层面就是多线程的问题。多线程的问题主要是线程安全的问题(其他还有活跃性问题...
    wenming6688阅读 327评论 0 0
  • 一.线程安全性 线程安全是建立在对于对象状态访问操作进行管理,特别是对共享的与可变的状态的访问 解释下上面的话: ...
    黄大大吃不胖阅读 894评论 0 3
  • 王母观云端 瑶池隐空山 幻景若七仙 梦惊起波澜。 青春戏摇船 笑看百过半 清新纳百川 澎湃照心欢 2017年8月陪...
    薇薇dicy阅读 420评论 13 35
  • 我很烦呐,我不知道该怎么开始,该做什么,该说什么,怎么开口 我很累啊,思想压在头上办不到就是欲望,是诱惑,是没心没...
    梁贝蒂Betty阅读 161评论 0 0