精华内容
下载资源
问答
  • 如果一个变量是成员变量,那么多个线程同一个对象的成员变量进行操作时,他们该成员变量是彼此影响的(也就是说一个线程成员变量的改变会影响到另一个线程)。 如果一个变量是局部变量,那么每个线程都会有一...

    关于成员变量与局部变量:

    如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,他们对该成员变量是彼此影响的(也就是说一个线程对成员变量的改变会影响到另一个线程) 。

     如果一个变量是局部变量,那么每个线程都会有一个该局部变量的拷贝,一个线程对该局部变量的改变不会影响到其他的线程。 

    实例:

     

    Servlet容器为了响应多个用户同时访问一个Servlet的HTTP请求,通常会为每个请求分配一个工作线程,这些工作线程并发执行同一个Servlet(即Servlet是单实例的)的service()方法。此时可能发生多线程对同一数据进行访问的情况。

    public class Hello extends HttpServlet{  
        private String name;  
          
        public void doPost(HttpServletRequest request,HttpServletResponse response)  
            throws ServletException,java.io.IOException{  
              
            response.setContentType("text/html;charset=UTF-8");  
              
            name = (String)request.getParameter("name");    //接收参数  
              
            PrintWriter out = response.getWriter();  
            out.println("<html><head><title>test</title></head><body>");  
            out.println("你好"+name);  
            out.println("</body></html>");  
                      
            out.close();  
        }  
    }  

    每当一个线程执行doPost()时,在线程的堆栈中就会创建name这个局部变量,当线程执行完该方法,局部变量就结束生命周期。如果多个线程同时执行该方法,那么每个线程都拥有自己的局部变量。

    2.使用Java同步机制对多线程同步

    public class Hello extends HttpServlet{  
        private String name;  
          
        public void doPost(HttpServletRequest request,HttpServletResponse response)  
            throws ServletException,java.io.IOException{  
              
            response.setContentType("text/html;charset=UTF-8");  
              
            synchronized(this){  
                name = (String)request.getParameter("name");    //接收参数  
                ...  
            }  
            ...  
        }  
    }  

    这样可确保在任意一时刻,只允许有一个工作线程执行doPost()中的同步代码块。只有当这个工作线程退出同步代码块时,其他工作线程才允许执行同步代码块。这使得任意时刻不会有两个线程同时操纵同一个实例变量,从而避免并发问题。

    3.实现被废弃的SingleThreadModel接口
    public class Hello extends HttpServlet implements SingleThreadModel{
      ...
    }
    如果实现此接口,则Servlet容器实现可以采用以下两种方式之一来运行Servlet:
    1)在任意一时刻,只允许有一个工作线程执行Servlet的service()方法。如果有多个用户同时请求访问该Servlet,那么这些客户请求被 放入等待队列,容器会依次响应等待队列中的每个客户请求。这种实现方式实际上禁止了多个客户端对同一个Servlet的并发访问。
    2)Servlet容器为每个Servlet创建一个对象池,在这个池中存放了同一个Servlet类的多个实例。如果有多个用户同时请求访问该 Servlet,Servlet容器会为每个请求分配一个工作线程,并且从对象池中取出一个空闲的Servlet实例,把它分配给工作线程。每个工作线程 执行自己的Servlet实例的service()方法。这种实现方式表面上允许客户端对同一个Servlet并发访问,但实际上不同客户端访问的是同一 个Servlet类的不同实例。
    如果实例变量需要共享,用以进行计算,这种方法并不能有效的避免并发问题。 

    转自:http://blog.sina.com.cn/s/blog_7ffb8dd5010118cq.html

    转载于:https://www.cnblogs.com/eason-chan/p/3684194.html

    展开全文
  • 一、在说明线程全局变量的影响之前,我们需要了解下面的一些基础知识: 1、线程是CPU分配时间片的最小单位,通常一个CPU内核可以处理一个线程,如果是双核双线程,那么同一时刻可以处理两个线程。 2、进程是...

    一、在说明多线程对全局变量的影响之前,我们需要了解下面的一些基础知识:

            1、线程是CPU分配时间片的最小单位,通常一个CPU内核可以处理一个线程,如果是双核双线程,那么同一时刻可以处理两个线程。

            2、操作系统分配资源的最小单位是进程,线程是进程的一个实体,是CPU调度分派的基本单位(比如时间片)。

            3、线程不能独立运行,必须依靠在某个进程下,一个进程可以包含一个或多个线程,同一个进程中的多个线程可并发执行(是否真正并发执行,需要看CPU核数和线程数)。

            4、全局变量是在所有函数外部定义的函数,他的作用域默认是整个程序,也就是所有的源文件, .c 和.h。

    二、假设现在有线程thread1,thread2两个线程,还有全局变量Num=0(Num++),寄存器add:

           1、线程对全局变量的访问会分为三步:

                        1)、取全局变量Num到寄存器add。

                        2)、对寄存器中的Num进行运算,既对Num的值进行运算。

                        3)、对寄存器运算完的值再存入Num中。

    三、多线程在执行的时候已经由操作系统分配了一定的CPU时间片,去规定此线程的运行时间是多久(中间可能由于优先级以及中断被阻碍)。

    四、当线thread1程执行到“第二步,对寄存器中的Nun进行运算”的时候,CPU分配的时间就已经到了,这样线程thread1就处于阻塞状态,此时Num的值依然是0,这样操作系统把执行权力交给了thread2执行,这样线程thread2执行完以后,Num变为1,然后CPU分配给thread2的时间到了,thread2被阻塞,操作系统把cpu控制权交给线程thread1,thread1从上次被阻塞的地方继续执行,这样输出的Num还是1,所以就造成了多线程操作同一个全局变量得到的结果是不可控的,也有可能输出的结果是0,1,2。

    小结:如果多线程里面有处理(写操作)全局共享变量(整型,链表等),一定要给线程加锁,加了锁,操作系统就会在执行代码的时候保证在操作同一变量时只有一个线程在进行,这样就保证了结果的正确性。如果多个线程只对全局变量读,而不去写这个全局变量,则也不用进行加锁处理。

    下一章节具体分析linux 下c的多线程代码(同步互斥,线程分离,休眠等)。

    转载请注明原创出处,本博客只是博主自己总结的一点知识,若在博客中分析的知识点不对,或者不完善,请各位博友指正更正,谢谢!

     

    补充:线程上下文切换

    1、对于单核CPU来说,在同一时刻只能运行执行一个线程,当操作系统把正在运行的线程1的cpu的控制权交给另外一个线程2去执行的时候,这个过程叫做线程上下文切换(进程也有上下文切换)。

    2、当在做上下文切换的时候,操作系统会把线程1中寄存器运算的值,以及指令执行到哪条的状态等进行保存下来,这样等下次恢复线程1运行状态时,会根据之前保存的这些状态值重新计算,所以线程上下文切换过程中会记录程序计数器、CPU寄存器状态等数据。

    3、对于线程的上下文切换实际就是:存储和恢复CPU状态的过程,就像在VMware中打一个快照一样,保存这一时刻虚拟机中的所有值,等到还原虚拟机的时候,虚拟机中的环境是打快照之前的环境。

     

     

    展开全文
  • 事实上,类似于for这种循环体内,定义的变量,每次循环用都是同块内存。因此,如果是系统内置变量比如int这种,就没有影响;如果是涉及到类等自定义类型,因为需要反复地创建和析构,会时间效率有影响。 ...

    事实上,类似于for这种循环体内,定义的变量,每次循环用的都是同一块内存。因此,如果是系统内置变量比如int这种,就没有影响;如果是涉及到类等自定义类型,因为需要反复地创建和析构,会对时间效率有影响。

    展开全文
  • 关于多个线程同时调用单例模式的对象,该对象中方法的局部变量是否会受多个线程的影响 对于那些会以多线程运行的单例类,例如Web应用中的Servlet,每个方法中局部变量的操作都是在线程自己独立的内存区域内完成...

    关于多个线程同时调用单例模式的对象,该对象中方法的局部变量是否会受多个线程的影响

    1. 对于那些会以多线程运行的单例类,例如Web应用中的Servlet,每个方法中对局部变量的操作都是在线程自己独立的内存区域内完成的,所以是线程安全的。

    2. 对于成员变量的操作,可以使用ThreadLocal来保证线程安全。

    局部变量不会受多线程影响
    成员变量会受到多线程影响

    多个线程应该是调用的同一个对象的同一个方法:

    • 如果方法里无成员变量,那么不受任何影响
    • 如果方法里有成员变量,只有读操作,不受影响
      存在写操作,考虑多线程影响值

    像银行账户这样的处理类,需要用单例模式来进行操作,则需要考虑多线程访问全局变量时发生的并发问题,如果需要用到每个处理类的全局变量是不共享的,可以考虑多例模式

    展开全文
  • 为了削弱变结构控制系统的抖振,提出一个新的滑动模态到达条件.分析了该到达条件参数系统动态性能的影响,讨论了参数的物理实现,并给出了到达时间的简化计算公式.仿真结果表明, 该到达条件能有效地抑制抖振.</p>
  • 进行二次分析以探索任务差异研究变量的影响。 任务差异包括分析和编程任务。分析揭示了以下内容。 系统分析师比程序员拥有更的界限。 系统分析师跨越边界时面临的主要危险是角色冲突,这会他们的工作满意度,...
  • 1. 多个线程可以使用同一个全局函数,需不需要处理同步视具体情况而定。 2. 全局函数中的局部变量互相不会影响,因为它们位于线程各自的堆栈中。 3. 全局函数中如果涉及了全局变量,那么该全局变量的访问...
  • 这个星期一直在研究lua,前段时间刚解决了一个问题,就是module全局变量的影响,因为lua还没有系统深入的了解,这个问题折腾了我大半天的时间,大致情况就是 我在主文件中其中一个模块文件声明了一个AAA全局变量...
  • 对于那些会以多线程运行的单例类,例如Web应用中的Servlet,每个方法中局部变量的操作都是...多个线程应该是调用的同一个对象的同一个方法: 如果方法里无成员变量,那么不受任何影响 如果方法里有成员变量,只...
  • 线程下操作同一个类全局变量

    千次阅读 2016-08-18 23:31:40
    一个全局变量在多线程情况下是如何改变 ...其中一个线程应该是输出99,但是还是读取到了另外一个线程改变数据,但是运行多次都会有一个98,说明多个线程调用同一个类对象,会全局变量影响
  • 构建了由一个直接从事再制造活动制造商和一个零售商组成闭环供应链系统。假设产品需求与产品销售价格、产品质量水平、制造商回收努力和零售商销售努力成线性关系,运用博弈论分析了闭环供应链系统在...
  • 针对已有的变量配对方法和交互影响分析方法存在的局限和不足,根据NI指数理论,提出适用于大规模、多变量的基于NI指数的控制变量配对方法,运用该方法找到使得控制器间交互影响最小的控制变量最优配对组合。通过...
  • 1 对于一个requestMapping局部变量,每个线程在调用时都会copy一份,然后使用,因此并不会影响其他调用 2 对于全局变量/成员变量则不会,会产生线程问题,常见解决方式是加锁。 转载于:...
  • 我们已经开始理解心理健康生产力,总体健康,人际关系和身体健康的影响,并将更的注意力放在心理健康上。 甚至雇主也开始更加重视提供工作环境和条件,以保持员工尽可能快乐和健康,而先进的公司则提供津贴,...
  • 如果一个变量是成员变量,那么多个线程同一个对象的成员变量进行操作时,它们该成员变量是彼此影响的,也就是说一个线程成员变量的改变会影响到另一个线程。 如果一个变量是局部变量,那么每个线程都会有一个...
  • Hellow大家好,我又来了,在上篇文章我们了解了使用jmeter在一个线程组中进行http接口测试,但是往往我们接到一个性能测试任务需要一个接口进行压测时不需要每一次请求都取登录(这样会影响测试结果),那么...
  • 基于身体自我图式理论和社会比较理论,考察图式启动和社会比较对女性身体不满意的影响,并探讨特质变量对图式启动效应的调节作用。特质变量在实验操作前星期测量,图式启动采用两种不同的图片情境想象任务,社会比较则...
  • 今天在复习 SpringMVC 时,看到一篇文章,写到 SpringMvc控制器是不是单例模式,如果是,有什么问题,怎么解决? 答:是单例模式,所以在线程访问时候有线程安全问题,不要用...任何一个类只要没有成员变量,就...
  • 如果一个变量是成员变量,那么多个线程同一个对象的成员变量进行操作时,它们该成员变量是彼此影响的,也就是说一个线程成员变量的改变会影响到另一个线程。  如果一个变量是局部变量,那么每个线程都会有...
  • 如果一个变量是成员变量,那么多个线程同一个对象的成员变量进行操作时,它们该成员变量是彼此影响的,也就是说一个线程成员变量的改变会影响到另一个线程。 如果一个变量是局部变量,那么每个线程都会有一...
  • Java线程访问成员变量与局部变量

    千次阅读 2017-02-05 17:53:42
    如果一个变量是成员变量,那么多个线程同一个对象的成员变量进行操作时,它们该成员变量是彼此影响的,也就是说一个线程成员变量的改变会影响到另一个线程。 如果一个变量是局部变量,那么每个线程都会有一...
  • 线程-局部变量和成员变量

    千次阅读 2017-09-06 11:14:00
    Java线程成员变量和局部变量的影响最近复习了一下Java线程的一些基础的础知识,这里演示一个java线程成员变量和局部变量的Demo局部变量的操作:/** * Java局部变量和成员变量代码演示 */ public class ...
  • 静态变量(类变量)为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均修改可见,故线程非安全。 实例变量属于创建对象,...即在每个线程都会有一个该局部变量的拷贝,一个线程该局部变量的改变不会影

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,319
精华内容 927
关键字:

多个变量对一个变量的影响