当前位置: 首页 > 网络应用技术

安全线程安全的设计

时间:2023-03-08 17:48:46 网络应用技术

  状态和无状态之间的区别:州店数据,无状态的未存储数据

  该对象是操作和数据包(对象=操作+数据)。对象中包含的数据称为对象的状态。它包含对象的对象的数据和静态变量中的数据。示例变量或静态变量。如果类的实例由多个线程共享,则没有共享状态,则称为无状态对象。

  即使没有实例变量或静态变量,类也可能仍然具有共享状态

  枚举的实例只能实例化一次,因此,如果没有与操作相对应的评论,这是一个完美的单个情况,而其他类也不状态。SingletonStance将在多线程环境中存在线程安全问题。以下示例更为明显。数字变量是共享状态变量。

  另一种情况是使用静态变量。静态变量与类(类)直接关联,该类别不会随着实例的创建而变化。操作静态变量仍然会导致线程安全问题,即测试中共享状态变量的调用。

  摘要:状态 - free对象不得包括任何实例变量或可以更新静态变量(包括来自相应类的类别的实例变量或静态变量)。无状态对象。

  没有状态类,只有静态方法的类

  Servlet类是无状态对象的典型应用。Servlet通常由Web服务器(TOMCAT)托管,以控制其创建,操作,破坏和其他生命周期。通常,Servlet类只会在Web服务器中具有一个实例,但是ITIT将由多个线程请求,并且处理请求的方法没有锁定。如果此类包含实例变量或静态变量,则将生成线程安全问题。

  不变的对象是指创建后无法立即更改的对象。

  不变的物体满足以下条件

  以下是必不可少的对象。在正常情况下,我们无法在创建实例之后改变其状态,因此,如果我们需要修改他,我们只能创建一个实例来替换它。

  使用不令人满意的物体将对垃圾回收的效率产生影响,这具有积极的一面和负面影响。

  负面:只要您想更新不变的对象,就必须重新创建一个新的非特征对象。过于频繁地创建对象会增加垃圾回收的频率。

  正面:一般来说,如果对象中的成员变量是对象引用,则通常在变量对象中,此参考对象在年轻一代中,并且变量对象本身在老年中,但是非变异对象通常是参考对象在老年中,并且不令人满意的对象本身是在年轻一代中。当修改状态变量对象的实例变量值时,如果此对象已经在老年中,那么当垃圾回收恢复时在下一轮中恢复,必须扫描卡的存储单元中的所有对象(卡,旧一代的存储单元)因此,旧一代的年龄段的人提到了年轻一代物体,以增加次要回收的开销。

  它可用于减少无法变量对象的存储空间占用^注意1

  对于一个非线程对象,其访问它的每个对象都会创建一个对象的实例,每个线程只能访问由本身创建的对象。对象)或局部变量。

  ThreadLoacl等同于线程访问其唯一对象。线程可以通过此对象创建并访问其各自线程的唯一对象。

  线程局部实例为每个线程提供线程的特定对象。

  public t get()获得了当前线程 - 相关线程 - 特定对象的当前线程特定对象公共void set(t value)re sypss of当前线程 - 基于线程的线程 - 特定于线程的特定对象 - 特定对象。thread.value(对象)是当前线程的线程特定对象,与初始状态下的线程相对应。Source代码分析

  如上所述,我们在threadlocaldemo类中构建了一个螺纹插座实例,并使用匿名类Anonymous.LET的调试将整个示例循环方法的方式重写。

  在上图中的GET方法中给出一个断点

  由于与此线程相对应的线程插入是一个空置值,因此您必须首先输入setInitialValue方法来初始化它。

  在这种方法中,主要是获取我们要采用的对象。如果您不重写initialValue()方法,如果您声明螺纹插座,则在此位置获得一个空值。然后为当前线程创建threadlocalmap实例并编写元素。最后,返回对象实例。获得threadlocal.get()方法。

  然后我们输入设置方法来观察该过程

  无论是空的,将获得第一个线程的线程界面。如果空为空,它将帮助他初始化一个并将设定参数保存到螺纹范围中,否则螺纹插座→值将存储在此容器中。

  设置方法的过程基本上是将我们的ThreadLocal(TL)实例的对象实例插入或修改螺纹插座(TL)的螺纹插座实例(TL)实例,以确定或修改它。

  基于Treadlocalhashcode的可追溯性,我们发现它是螺纹局部类中的自我信息静态变量。

  以上是相关线程实例的存储条目阵列中的搜索,以及插入替换方法:

  插入新条目后,您必须穿越条目数组以找到值为空的输入,并将相应的条目设置为NULL,然后确定该条目数组是否需要执行容量扩展操作。

  集合结束后,再次调用GreadLocal的实例对象,因为上一个线程的线程已初始化并存在,并存在当前螺纹插座(TL)对象的输入(当第一个initvalue的initvalue初始化时,在获得第一个初始化时被调用了,对于b),因此您可以直接获得目标代理的实例对象(“ b”)。

  常规线程本地变量将被声明为静态变量,因为这只会在加载类时创建一次。如果声明是一个实例变量,则每次都会创建一次类的局部变量,这将导致它引起它,这将导致它导致它,这将导致它会引起它,这会导致它引起它,这会导致它引起它,这将导致它引起它,这会导致它引起它,这会导致它引起它,这将导致它。资源。