广州品牌型网站建设,上海网站推广找哪家,工商联网站建设作用,wordpress 编码在上文中#xff0c;《Java代码质量改进之#xff1a;同步对象的选择》#xff0c;我们提出了一个场景#xff1a;火车站有3个售票窗口#xff0c;同时在售一趟列车的100个座位。我们通过锁定一个靠谱的同步对象#xff0c;完成了上面的功能。现在#xff0c;让我们反过…在上文中《Java代码质量改进之同步对象的选择》我们提出了一个场景火车站有3个售票窗口同时在售一趟列车的100个座位。我们通过锁定一个靠谱的同步对象完成了上面的功能。现在让我们反过来每个窗口负责一趟车。比如一号窗口就卖1号列车的票二号窗口就卖2号列车的票。不过它们需要同时开始卖票。一ThreadLocal的最简应用首先既然是各卖各的火车了那么就不需要同步了。于是代码又回归到但是当前的代码肯定是不对的每个线程访问的都是同一个火车的ticket并且还会出现超售现象。要保证每new一个窗口出来就有一趟自己的列车我们就可以用到ThreadLocal对象了。让我们首先替换掉ticket变量改为然后售票的代码改为虽然ticket依然是一个static变量但是运行程序你会发现新起一个线程不同的线程还是会拥有自己的ticket不会互相干扰。也就是实现了每个窗口卖自己那趟车的目标。二ThreadLocal VS 实例变量每一个程序员都应该是杠精。为什么因为回过神来的我们发现只要回到第一段代码中把ticket中的static去掉就能达到同样的目的试下上面的代码是不是也能达到各卖各的目的我们是脑袋被门板挤了才想出来一个TheadLocal这样的复杂方案吗如果单纯说上面的这段代码是的。但是还有很多的场合是ThreadLocal的用武之处。比如我们并不永远使用extends Thead的方式来写多线程我们还可能用implements Runnable的方式来写多线程(ps还有更多的写法哦)如下而在这种情况下我们就不得不使用TheadLocal了这里就不放出代码了大家可以试一下。甚至更进一步的我们是不是能够把ticket这个变量放进方法内部呢如果放入方法内部的话我们同样也是必须要使用ThreadLocal才能达到实现目的如下总之简单来说当要运行的代码本身不是很方便访问当前的线程实例的时候就是ThreadLocal的用武之地。三ThreadLocal的应用场景ThreadLocal有这样一些应用场景比如连接池管理、会话管理等等。在连接池的管理中当我们需要获取一个连接就应该为每一次获取给出不同的连接。在web应用中请求是被线程池管理的也就是说获取连接这个行为不是单线程行为所以我们最好就要设计成不同的线程不能获取同一个连接要保证能做到这样就应该使用ThreadLocal了。可能有人会表示那不能设计成实例变量吗答案是不能。因为在web应用中线程都不是被我们自己管理的所以最佳的做法就是使用ThreadLocal。一个标准的做法如下最后作为补充我们再来看看hibernate中ThreadLocal的应用以下是广告时间最课程(http://zuikc.com)正在招收Java就业班学员如果你想学习更多的Java高质量代码编写方面的技巧请联系我们哦。