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

一个合格的网站设计wordpress广告代码

一个合格的网站设计,wordpress广告代码,呼和浩特免费制作网站,外包程序员的出路SUN公司早在JDK1.2的时候就为我们提供了java.lang.ThreadLocal,低版本的JDK所提供的get()返回的是Object对象#xff0c;需要强制类型转换#xff0c;使用起来不方便#xff0c;而在JDK1.5引入了泛型#xff0c;在一定程度地简化ThreadLocal的使用。 我们知道在spring容器中…  SUN公司早在JDK1.2的时候就为我们提供了java.lang.ThreadLocal,低版本的JDK所提供的get()返回的是Object对象需要强制类型转换使用起来不方便而在JDK1.5引入了泛型在一定程度地简化ThreadLocal的使用。   我们知道在spring容器中获取实例的时候都是默认单例模式这在多线程开发的时候是尤其要注意的地方下面先简单总结一下在开发中都有哪些情况需要考虑线程安全问题。   1常量始终是线程安全的它的值在初始化之后不可以改变所以只存在读操作。   2每次调用方法前都新建一个实例是线程安全的因为不会访问共享的资源。  3局部变量是线程安全的。因为每执行一个方法都会在独立的栈空间创建局部变量它不是共享的资源。局部变量包括方法的参数变量和方法内变量。  4无状态的bean是线程安全的所谓无状态就是一次操作不能保存数据。无状态对象(Stateless Bean)就是没有实例变量的对象不能保存数据是不变类是线程安全的。无状态的Bean适合用不变模式技术就是单例模式这样可以共享实例提高性能。   5有状态的Bean多线程环境下不安全。所谓有状态就是有数据存储功能有状态对象(Stateful Bean)就是有实例变量的对象可以保存数据是非线程安全的。有状态的bean适合用Prototype原型模式。Prototype: 每次对bean的请求都会创建一个新的bean实例。   6静态变量在多线程环境下不安全。   总的来说线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作而无写操作一般来说这个全局变量是线程安全的若有多个线程同时执行写操作一般都需要考虑线程同步否则就可能影响线程安全。Struts2默认的实现是Prototype模式。也就是每个请求都新生成一个bean实例所以不存在线程安全问题。需要注意的是如果由Spring管理bean的生命周期 scope要配成prototype作用域同时在每次获取bean时都要从上下文对象中去取而不仅仅是在配置文件中将scope配置成prototype。   通常来讲当我们遇到线程安全问题第一反应就是采用同步机制synchronize通过对象的锁机制保证同一时间只有一个线程访问变量这时该变量是多个线程共享的使用同步机制要求程序慎密地分析什么时候对变量进行读写什么时候需要锁定某个对象什么时候释放对象锁等繁杂的问题程序设计和编写难度相对较大。而ThreadLocal则从另一个角度来解决多线程的并发访问。ThreadLocal会为每一个线程提供一个独立的变量副本从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象在编写多线程代码时可以把不安全的变量封装进ThreadLocal。在Spring中绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean如RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder等中非线程安全状态采用ThreadLocal进行处理让它们也成为线程安全的状态因为有状态的Bean就可以在多线程中共享了。   下面让我们打开源码看一下ThreadLocal是怎样实现多线程环境下变量共享首先看ThreadLocal接口   它主要有下4个方法void set(Object value)设置当前线程的线程局部变量的值public Object get()该方法返回当前线程所对应的线程局部变量public void remove()将当前线程局部变量的值删除目的是为了减少内存的占用该方法是JDK 5.0新增的方法。需要指出的是当线程结束后对应该线程的局部变量将自动被垃圾回收所以显式调用该方法清除线程的局部变量并不是必须的操作但它可以加快内存回收的速度protected Object initialValue()返回该线程局部变量的初始值该方法是一个protected的方法显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法在线程第1次调用get()或set(Object)时才执行并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。           我们仔细来看其set方法的实现获取当前线程根据线程获取一个ThreadLocalMapThreadLocal的一个静态内部类对象。如果存在则set进去一组值key就是当前的ThreadLocal对象value就是当前线程下该变量副本的值如果不存在则创建一个ThreadLocalMap对象我们点开creatMap方法发现它会创建一个新的ThreadLocalMap对象并且把当前ThreadLocal对象作为key把初始化的值作为value放进去然后赋值给当前线程的threadLocals属性,它的类型是ThreadLocalMap。   由此我们可以得知每个线程都有一个ThreadLocalMap类型的属性threadLocals它的初始值为null当我们第一次在线程中调用ThreadLocal的set方法时他会根据线程去找对应的ThreadLocalMap对象此时对象为null则创建一个新的ThreadLocalMap对象初始key当前threadLocal对象初始value当前threadLocal对象执行initialValue()方法后的值并把它赋值给threadLocals当第二次再调用ThreadLocal的set方法时则直接给当前线程的threadLocals属性里面的value值覆盖掉因为key值始终不变当第一次调用ThreadLocal的get方法时首先获取当前线程根据线程找到对应的ThreadLocalMap对象然后根据当前的ThreadLocal对象去获取对应的value值。总的来说就是每个线程都有自己的ThreadLocalMap类型的一个属性它是一个集合里面的key类型为ThreadLocalvalue就是各个ThreadLocal对象的变量副本的值一个线程中有几个ThreadLocal类型的对象那么这个线程的属性threadLocals就有几组值。   下面我们通过实例来演示一下使用ThreadLocal和不使用的区别代码如下            我们可以看到使用ThreadLocal后我们有状态的bean在多线程环境下可以正确的显示出结果不互相影响当我们不用ThreadLocal将全局变量包裹时修改TestThreadLocal类测试结果如下           此时如果有过个线程同时对一个单例对象进行修改操作时就会出现线程安全问题。   ThreadLocal是解决线程安全问题一个很好的思路它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单更方便且结果程序拥有更高的并发性。转载于:https://www.cnblogs.com/hhhshct/p/6938003.html
http://www.pierceye.com/news/430721/

相关文章:

  • 网站建设 外包是什么意思微信小程序低代码开发
  • 网站底部信息用js写法莱芜雪野湖有什么好玩的
  • 青岛高品质网站制作优化快速排名教程
  • 地产项目网站长沙建个网站一般需要多少钱
  • 什么样的网站流量容易做社区网站建设
  • 网站的虚拟主机到期延吉建设局网站
  • 深圳seo网站优化公司wordpress页面权限插件
  • 手机制作购物网站农业 网站源码
  • 飞沐网站设计成都推广网站多少钱
  • 网站建设需要什么手续秦皇岛市房价
  • seo织梦网站建设步骤西宁网络公司电话
  • 河南省建设厅网站 吴浩石家庄做外贸网站建设
  • 免费网站发布怎么做的校园网站建设的参考文献
  • 网站空间管理平台腾讯会议多少钱一个月
  • 手机网站开发如何设置触摸功能的网页设计培训班
  • 淘宝客自己做网站中信建设有限责任公司 闫励
  • wordpress 分页不出来昆明网站快速优化排名
  • 玉泉路网站制作369网站建设中心
  • 服务器建设网站办一家建筑公司怎么样
  • 官网网站设计小程序免费制作流程
  • 宜昌哪有有做网站的wordpress如何添加页面子目录
  • 高端网站制作开发html写一个简单购物页面
  • 为什么百度搜索不到我的网站网站服务商排名
  • 深圳建设网站首页国土 住房与城乡建设部网站
  • wordpress拖拽式建站主题wordpress 类似软件
  • ps制作网站logo广西建设局网站
  • 专业网站建设公司排名wordpress上传媒体文件大小修改
  • 郑州app开发公司排名网站seo 文章转载 修改标题
  • 深圳网站备案查询成都建设施工安全协会网站
  • 做视频找素材的网站有哪些邢台做网站多少钱