一致性问题:
1、多个主体无法对同一份数据达成共识;
2、包括分布式一致性问题和并发问题;
3、特点是场景多问题复杂难以察觉,需要严密的思考甚至数学论证。
一致性问题的解决办法:
1、排对(例如:锁,互斥量,管程,屏障);
2、投票(例如:Paxos,Raft)
以上两个都有额外开销,避免的方式可以选择ThreadLocal。
ThreadLocal是什么?
提供线程局部变量,一个线程的局部变量在多个线程中有独立的副本,特点有:简单(开箱即用),快速(无额外开销),安全(线程安全);场景:多线程场景(资源持有,并发计算,线程一致性,线程安全)使用hash表实现,几乎所有提供多线程特征的语言都是其应用范围。
ThreadLocal基本的API:带有泛型的构造函数,访问器get/set,初始化,回收
ThreadLocal四种核心场景:
1、线程资源持有(ThreadLocalMap实现,持有线程资源供线程的各个部分使用,全局获取减少变成难度)
2、线程资源一致性(帮助需要保持线程一致的资源,维护一致性,降低编程难度,例如:JDBC会话连接)
3、线程安全(帮助只考虑了单线程的程序库,无遐想多线程场景迁移)
4、分布式计算(帮助分布式计算场景的各个线程累计局部计算结果)
个人理解:
字面意思是线程本地变量,主要用来处理一致性问题,在很多优秀的框架中都有使用,比如java的QuartzSimpleSemaphore,mybatis中的SqlSessionManager,Spring对分布式事务的支持。如果单充的单线程但并发那这个关键字是毫无用处的,但在高并发的场景下这个是一个优秀的设计思路,使用起来和一般的变量没有差异,主要解决四个方面的问题:1、资源持有:一个业务流程可能很长,同一个线程下用户数据等数据存留在线程本地变量中,而不用到处传递。2、线程一致,分布式事务场景同一线程下统一由一个Context管理。3、线程安全:因为使用了该关键字使得线程隔离,不存在安全问题。4、并发计算:这个只是一种设计思路,非常重的一个任务拆成一个个小任务。每个线程并发处理的结果可以存放在线程本地变量,最后统一收集。