当前位置: 首页 > news >正文

江苏亿之盛建设有限公司网站软件技术专业可以从事什么工作

江苏亿之盛建设有限公司网站,软件技术专业可以从事什么工作,厦门企业网站设计公司,网站底部设计*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更…*************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更新 *************************************优雅的分割线 ********************************** SimpleExecutor 前言 多线程是Java的一个重要特性多线程从某方面可以等价于多任务当你有多个任务要处理时多个任务一起做所消耗的时间肯定比任务串行起来做所消耗的时间短。而对于多线程不熟悉的新手则容易踩到很多坑最典型的则是变量问题。 概念介绍 下面先用简单粗俗的语言解释一下几个基本概念 线程安全多线程访问时采用了加锁机制当一个线程访问该类的某个数据时进行保护其他线程不能进行访问直到该线程读取完其他线程才可使用。不会出现数据不一致或者数据污染。典型的例子为StringBuffer类。 线程不安全不提供数据访问保护有可能出现多个线程先后更改数据造成所得到的数据是脏数据。典型的例子为StringBuilder类。Servlet和SpringMVC采用的是单例设计模式因此也是线程不安全的。而aop中如果定义了成员变量也是线程不安全的。 Java内存模型 参考我之前的文章Java内存模型介绍 结合Java内存模型的介绍可知在单例模式下多个线程操作同一个变量会发生线程安全性问题简单来说就是一个变量name在线程A中命名为“李铁蛋”而线程B将其命名为“李蛋”此时线程A输出变量name极有可能输出的是“李蛋”。因此就需要使用ThreadLocal来给每个线程提供局部变量解决线程安全问题。 示例 首先我们来看一下关于线程不安全的情况 public class test003 implements Runnable {private Res res;public test003(Res res) {this.res res;}public void run() {for (int i 0; i 10; i) {System.out.println(Thread.currentThread().getName() , res.getNumber());try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}}public static void main(String[] args) {Res res new Res();for (int i 0; i 4; i) {new Thread(new test003(res)).start();}}}class Res {public Integer count 0;public Integer getNumber() {return count;}}程序中的res变量则为主内存中的变量每个线程都会操作同一个res获取到的也是同一个count因此其中一次运行打印出来的结果如下 Thread-0,1 Thread-1,2 Thread-2,3 Thread-3,4 Thread-0,5 Thread-1,6 Thread-2,7 Thread-3,8 Thread-0,9 Thread-1,10 Thread-2,11 。。。。。程序的本意为打印每个线程从1开始增长而运行结果中比如线程0第一次为1第二次为5很明显不符合要求我们将程序部分代码如下改造 class Res {public static ThreadLocalInteger threadLocal new ThreadLocalInteger() {Overrideprotected Integer initialValue() {return 0;}};// 这里其实可以使用JDK8的Lambda表达式简化代码// public static ThreadLocalInteger threadLocal ThreadLocal.withInitial(() - 0);public Integer getNumber() {int count threadLocal.get() 1;threadLocal.set(count);return count;}}改造后的代码使用ThreadLocal创建一个成员变量泛型为Integer表示这个成员变量为int类型。在getNumber方法中执行的则是count操作。threadLocal.get()方法的作用是获取当前线程threadLocal中的值1之后获取本次的count并set回去。我们看一下输出结果。 Thread-0,1 Thread-2,1 Thread-3,1 Thread-1,1 Thread-0,2 Thread-2,2 Thread-3,2 Thread-1,2 Thread-1,3 Thread-0,3 Thread-2,3 Thread-3,3 。。。。每个线程的结果都是从1开始增长。 总结 ThreadLocal的作用是给每个线程提供局部变量而这个局部变量就是存储到工作内存中的。线程之间的局部变量互不影响达到线程安全的目的。ThreadLocal的应用相当广泛如SpringCloud在网关中获取当前的request就是使用的ThreadLocal 部分代码如下 public class RequestContext extends ConcurrentHashMapString, Object {// ThreadLocal存储RequestContextprotected static final ThreadLocal? extends RequestContext threadLocal new ThreadLocalRequestContext() {protected RequestContext initialValue() {try {return (RequestContext)RequestContext.contextClass.newInstance();} catch (Throwable var2) {throw new RuntimeException(var2);}}};// 获取Request上下文public static RequestContext getCurrentContext() {if (testContext ! null) {return testContext;} else {RequestContext context (RequestContext)threadLocal.get();return context;}}// 获取当前线程的requestpublic HttpServletRequest getRequest() {return (HttpServletRequest)this.get(request);}}SpringCloud的源码我还没开始看这玩意源码太多了估计啃不动现在在啃Mybatis源码因此下面对此的分析只是推测还希望大佬们不要打我。 Zuul在请求进入后首先会获取到request并将其存储在RequestContext中使用threadLocal存储可以保证每个线程获取到的request都是属于自己的。后续在程序的任意处都可以使用 RequestContext.getCurrentContext().getRequest() 来获取当前请求的request对象。 错误使用 在web应用中经常会有人把ThreadLocal作为每个线程的全局变量使用这种用法是错误的。SpringBoot底层有线程池对于每一个请求都会从线程池中随机取出一个线程因此即使是同一个登录的用户每一次请求都有可能不是同一个线程而从ThreadLocal中获取到的值自然也不一样。关于每次请求都不是同一线程的问题可以自行打印请求的线程id进行证明这里就不贴代码了。 ThreadLocal在web应用中的使用场景为为每次请求提供一个全局的值在这一次请求中可以在任何地方取出来这个值进行操作。如在aop中解析token获取登录中的用户信息存放到ThreadLocal本次请求需要用到登录用户的信息就可以取出来。再如开发者在aop中记录日志代码全部写到环绕通知中就显得冗余因此获取ip、参数等内容会写到前置通知中。而对于要存表的日志参数在前置通知返回值在后置通知报错信息在环绕通知中可能会想到把变量定义到最上面这种写法也是错误的。在上面说过aop是单例模式因此这种写法存在线程安全性问题在这里就也可以使用ThreadLocal存储日志信息最后在后置通知中存表。 *************************************优雅的分割线 ********************************** 分享一波:程序员赚外快-必看的巅峰干货 如果以上内容对你觉得有用,并想获取更多的赚钱方式和免费的技术教程 请关注微信公众号:HB荷包 一个能让你学习技术和赚钱方法的公众号,持续更新 *************************************优雅的分割线 ********************************** SimpleExecutor
http://www.yutouwan.com/news/16962/

相关文章:

  • 山东城市建设招生网站河源网站建设1993seo
  • 共享ip服务器做网站wordpress把相对路径
  • 领先的响应式网站建设平台wordpress php 开发
  • 南昌外贸网站建设外国酷炫网站
  • 重庆市建筑工程信息官方网站网站整站优化推广方案
  • 智能网站建设设计召开网站建设培训会
  • wordpress全站背景互联网企业解决方案
  • 网站做动态图片大全合肥网站建设卫来科技
  • 上海有名的网站建设公司展示型网站设计
  • 做网站时怎么让边框细一点cc0图片素材网站
  • 经典模板网站建设4.请简述网站建设流程的过程
  • 动易网站 青春安防网站模板下载
  • 手机视频制作软件哈尔滨网站优化方式
  • 类似凡科网的网站朝阳网站建设 高碑店
  • wordpress做出的网站手机开发者选项怎么设置手机流畅
  • 电子商务网站建设与管理实训心得网站的tdk指的是什么意思
  • 景区网站建设策划网站开发学些什么软件
  • jsp做的知名网站一般网站图片尺寸
  • 营销型企业网站优化wordpress支付宝扫码支付宝
  • 网站如何做分站东莞市塘厦镇
  • 公司网站备案信息查询newsplus wordpress
  • 网站关键词热度asp网站有哪些
  • 如何免费注册网站平台建筑论坛网站
  • 平顶山公司网站建设wordpress用户注册打文章
  • 黔东南企业网站建设温州网站建设策划方案
  • 网站建设使用情况wordpress 小工具 插件
  • 公众号网站怎么做网站做电商资质
  • 网站建设对企业影响有多大专业建站的网站
  • 做响应式网站的廊坊网站建设报价
  • 如何快速做一个网站企业网站建设方案详细方案