java线程---成员变量与局部变量

     2022-03-22     463

关键词:

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

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

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

实例:

 

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

Java代码
  1. public class Hello extends HttpServlet{  
  2.     private String name;  
  3.       
  4.     public void doPost(HttpServletRequest request,HttpServletResponse response)  
  5.         throws ServletException,java.io.IOException{  
  6.           
  7.         response.setContentType("text/html;charset=UTF-8");  
  8.           
  9.         name = (String)request.getParameter("name");    //接收参数  
  10.           
  11.         PrintWriter out = response.getWriter();  
  12.         out.println("<html><head><title>test</title></head><body>");  
  13.         out.println("你好"+name);  
  14.         out.println("</body></html>");  
  15.                   
  16.         out.close();  
  17.     }  
  18. }  



如果多线程并发访问,会访问同一个实例变量,则会共用name,而出现用户得到数据不一致的现象。

解决办法:
1.将name设置为局部变量。

Java代码
  1.       
  2. public class Hello extends HttpServlet{  
  3.       
  4.     public void doPost(HttpServletRequest request,HttpServletResponse response)  
  5.         throws ServletException,java.io.IOException{  
  6.           
  7.         response.setContentType("text/html;charset=UTF-8");  
  8.           
  9.         String name = (String)request.getParameter("name"); //接收参数  
  10.           
  11.         ...  
  12.     }  
  13. }  


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

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

Java代码
  1. public class Hello extends HttpServlet{  
  2.     private String name;  
  3.       
  4.     public void doPost(HttpServletRequest request,HttpServletResponse response)  
  5.         throws ServletException,java.io.IOException{  
  6.           
  7.         response.setContentType("text/html;charset=UTF-8");  
  8.           
  9.         synchronized(this){  
  10.             name = (String)request.getParameter("name");    //接收参数  
  11.             ...  
  12.         }  
  13.         ...  
  14.     }  
  15. }  


这样可确保在任意一时刻,只允许有一个工作线程执行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类的不同实例。
如果实例变量需要共享,用以进行计算,这种方法并不能有效的避免并发问题。 

多线程访问成员变量与局部变量

ThreadLocal是JDK引入的一种机制,它用于解决线程间共享变量,使用ThreadLocal声明的变量,即使在线程中属于全局变量,针对每个线程来讲,这个变量也是独立的。 它通过为每个线程提供一个独立的变量副本解决了变量并发访问... 查看详情

java基础之局部变量与全局变量以及成员变量的区别

...:当局部变量与全局变量重名时,起作用的是局部变量。成员变量定义:在类体的变量部分中定义的变量,也称为字段。区别:java中没有全局变量的定义,这是C中的例:classDemo{in 查看详情

记录java学习的历程之关于局部变量与成员变量

...的路上越走越远。 在JAVA中,我们会遇到局部变量与成员变量这两个变量的分类,这是按声明位置划分的,下面是对这两个变量的简单定义。局部变量:方法或语句块内部定义的变量。成员变量:方法外部,类的内部定义的... 查看详情

成员变量与局部变量的区别

成员变量与局部变量的区别1、在类中的位置不同成员变量:在类中方法外面局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中)2、在内存中的位置不同,可以看看Java程序内存的简单分析成员变量:在堆中(... 查看详情

java实例变量类变量与局部变量

...干扰,能通过对象的引用来访问实例变量。但在Java多线程中,实例变量是多个线程共享资源,要注意同步访问时可能出现的问题。<spanstyle="font-size:14px;">p 查看详情

java局部变量与成员变量(代码片段)

成员变量:a局部变量:ia可以直接声明变量不用初始化值,因为在初始化类的时候jvm会初始化a;i不可以不初始化而进行运算,javac强制规定如此,局部变量在调用的时候是可以确定该变量的值的,所以... 查看详情

startfromthebeginning-java(成员变量与局部变量的区别封装构造方法)

一、成员变量与局部变量的区别二、封装1、原则将属性隐藏起来,若需要访问某个属性,提供公共方法对其访问。2、封装的步骤3、封装优化——this关键字this的含义4、封装优化——构造方法注意事项5、标准代码——JavaBean 查看详情

多线程访问全局变量和局部变量

如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作时,它们对该成员变量是彼此影响的,也就是说一个线程对成员变量的改变会影响到另一个线程。如果一个变量是局部变量,那么每个线程都会有一个该... 查看详情

成员变量与局部变量

成员变量与局部变量的区别  方法的形式参数与局部变量同等对待1、在类中的位置不同成员变量:在类中方法外面局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中)2、在内存中的位置不同成员变量... 查看详情

java高阶部分知识点汇总-成员变量与局部变量详讲(代码片段)

...中,根据定义变量的位置不同,可以将变量分为两大类:成员变量与局部变量。而两者的运行机制也存在着较大的差异,本篇文章将详细介绍这两种变量的运行差异。一.成员变量成员变量指的是类范围里所定义的变量,也就是... 查看详情

成员变量与局部变量

查看详情

成员变量与局部变量

成员变量:在类中定义,用来描述对象将要有什么;可以由本类中的方法调用;其他类的方法也可以调用;局部变量:在类的方法中定义,在方法中临时保存数据;只有它本身的方法可以调用;成员变量与局部变量的区别:作用... 查看详情

java_se基础——26.[深入解析]局部变量与成员变量的区别

...JAVA_SE基础——10.变量的作用域定义的位置上区别:1.成员变量是定义在方法之外,类之内的。2.局部变量是定义在方法之内。作用上的区别:1.成员变量的作用是用于描述一类事物的公共属性的。2.局部变量的作用就是... 查看详情

转-java基础深入解析——类与对象

...,u010425776,http://m.blog.csdn.net/u010425776/article/details/46932867成员变量与局部变量的区别1.成员变量定义在类中,整个类中都能够访问。 局部变量定义在局部代码块中,只能在局部代码块中访问。2.成员变量存在于堆内存中,有初... 查看详情

(二十六)成员变量与局部变量

/**局部变量和成员变量的区别:*1.局部变量没有默认值,成员变量有默认值*2.局部变量再栈中开辟内存,成员变量再堆中开辟内存*3.局部变量作用范围有限旨在定义的环境中,成员变量作用范围是整个类*4.局部变量从其所在的函... 查看详情

关于java语言,来高手

类变量与成员变量区别例如成员变量A在A类里,然后在B类被赋值..在C类引用这个成员变量A能接收到这个值?局部变量和成员变量的区别在方法内部可以定义变量,被称为局部变量。局部变量的一般形式如下[变量修饰符]变量类型... 查看详情

java变量存储

...法的形参同局部变量管理。局部变量在虚拟机栈中,属于线程私有,不会出现线程安全问题,随方法的执行结 查看详情

java中的对象使用局部变量与成员变量的区别(代码片段)

...象的使用对象的使用格式创建对象:使用对象访问类中的成员:对象的使用格式举例:publicstaticvoidmain(String[]args)//1.导包。//我需要使用的Student类,和我自己Demo02Student位于同一个包下,所以省略导包语句不写//2.创建,格式://类名... 查看详情