精华内容
下载资源
问答
  • 文章目录: 1.介绍 2.生命周期 ... 来自于同一个网站下Servlet都可以使用全局作用域对象进行数据共享。 2.生命周期 在tomcat启动时,自动为当前网站创建一个全局作用域对象。 在tomcat运行...

    文章目录:

    1.介绍

    2.生命周期

    3.存在的问题 

    4.应用举例 

    4.1 代码部分 

    4.2 运行结果部分

    5.实现原理图


    1.介绍

    1. ServletContext接口来自于Servlet规范。
    2. ServletContext接口实现类由Http服务器厂商提供。
    3. ServletContext接口修饰对象被称为全局作用域对象。
    4. 来自于同一个网站下Servlet都可以使用全局作用域对象进行数据共享。

    2.生命周期

    1. 在tomcat启动时,自动为当前网站创建一个全局作用域对象。
    2. 在tomcat运行时,一个网站中有且只能有一个全局作用域对象。
    3. 在tomcat关闭时,自动销毁网站中全局作用域对象。

    3.存在的问题 

    1. 如果不进行限制,无限向全局作用域对象添加数据。导致服务端计算机内存消耗殆尽。
    2. 容易导致数据污染。

    4.应用举例 

    两个Servlet之间通过 ServletContext 接口实现数据共享。(OneServlet、TwoServlet)

    4.1 代码部分 

    package com.songzihao.controller;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     *
     */
    public class OneServlet extends HttpServlet {
    
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.通过请求对象向Tomcat索要当前网站中全局作用域对象
            ServletContext application=request.getServletContext();
            //2.将数据添加到全局作用域对象中作为共享数据
            application.setAttribute("key1",100);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    }
    
    package com.songzihao.controller;
    
    import javax.servlet.ServletContext;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     *
     */
    public class TwoServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            //1.通过请求对象向Tomcat索要当前网站中全局作用域对象
            ServletContext application=request.getServletContext();
            //2.从全局作用域对象读取数据
            Integer data= (Integer) application.getAttribute("key1");
            System.out.println("TwoServlet得到的共享数据:" + data);
        }
    
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
        }
    }
    
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    
        <servlet>
            <servlet-name>OneServlet</servlet-name>
            <servlet-class>com.songzihao.controller.OneServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>OneServlet</servlet-name>
            <url-pattern>/one</url-pattern>
        </servlet-mapping>
    
        <servlet>
            <servlet-name>TwoServlet</servlet-name>
            <servlet-class>com.songzihao.controller.TwoServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>TwoServlet</servlet-name>
            <url-pattern>/two</url-pattern>
        </servlet-mapping>
    </web-app>

    4.2 运行结果部分


    5.实现原理图

     

    展开全文
  • java全局变量

    千次阅读 2008-06-06 17:07:00
    2、类中的任何static public的成员变量都是全局共享的。3、JAVA中不应该有所谓全局变量的概念,全局变量严重影响了封装和模块化,所以如果你的程序中需要所谓的全局变量,那一定是你对程序的设计出了问题。4、那JAVA

    “java中全局变量应该放哪儿? ”引发的争论

    1、单独写一个final的类,在里面定义final   static的全局变量,在其它程序里包含进来就可以了。

    2、类中的任何static   public的成员变量都是全局共享的。

    3、JAVA中不应该有所谓全局变量的概念,全局变量严重影响了封装和模块化,所以如果你的程序中需要所谓的全局变量,那一定是你对程序的设计出了问题。

    4、那JAVA提供FINAL   STATIC   干吗用啊,存在即合理,很多情况是需要用到全局变量的。他能减少参数的传递,能避免重复声明。

    5、FINAL   STATIC应该理解为常量,而不是“全局变量”,它的目的不是为了让你每个类都可以访问,而是独立于具体对象,抽象到类层次的东东。

    6、class   Global   {         public   static   final   String   APPNAME=   "xyz";   //   global   constant         public   static   String   currentUser   =   "abc";     //   global   variable         ...     }         class   WhatEver   {         ...         System.out.println(Global.APPNAME);         Global.currentUser   =   "Williams";     }

    7、JAVA中不应该出现”全局变量“的概念。以上争论的焦点是:public   static   final   类型   变量   是否属于所谓的“全局变量”不得而知。它只不过实现了全局的意图。我们要用到该变量时,只需要把该变量所在的类引用进来就可以了。这不正是我们所需要的吗?不过还是要强调一定要真正理解JAVA当初出现的初衷就是为了安全性和跨平台性。     去掉了类似C,C++中的全局变量的概念,就是基于此的。

    8、有了全局变量安全性就差了。

    9、不用全局变量固然不无道理,但是世事无绝对,看运用,有的时候垃圾也能变成王道! 就象goto一样,他本身没什么错,错在运用者,用的过多过滥当然不对,但是为了避免使用GOTO却用1000行来饶开,难道看1000行代码就一定看的很清晰吗?java的全局变亮也是一样,不能用的太滥,什么东西都往全局上靠图省事自然会出问题,但是过度恐惧不敢用也不可取,该用的场合还是要用的.特别是独体类型,全虚拟机只有一份,数据库连接池对象一般就是独体对象,至于原因,我想不用我多说了吧!

    10、如果一个栈内存段就能搞定的事情,为何要用多个堆内存段来实现呢?

    11、对于“象goto一样,他本身没什么错,错在运用者,用的过多过滥当然不对,但是为了避免使用GOTO却用1000行来饶开,难道看1000行代码就一定看的很清晰吗?”确实全局变量在某些环境下可能还有其实际的意义。但是在JAVA中,确实没有所谓的全局变量的概念,通过设置一个abstract   class   or   interface,并将许多final   or   final   static   field置于其中,并在使用时调用ClassName.xxx   or   InterfaceName.xxx来模拟全局变量的使用(可以肯定的是,在许多的著作中大师们都已经反复强调了将许多常数放入一个abstract   class   or   interface,并使之成为常数类或常数接口的做法是对此功能的误用,并不鼓励如此使用,有兴趣可以参阅《effective   java》——机械工业出版社出版   Joshua   Bloch   著),但             首先,final   or   final   static确实不是全局变量的概念,在JAVA中,一切都是对象,在对象中声明的无论是field还是method亦或是property都将归属于某一种抽象或具体类型,否则也不会在调用中使用ClassName.xxx   or   InterfaceName.xxx这样的形式来加以说明这是这个CLASS的XXX,那是那个INTERFACE的XXX。事实上final代表的是一种常量形式(Constant),而static则代表一种静态观念,常量的概念是为了区别于变量而存在的不变的变量(有些别扭,突然发现自己词语贫乏,HOHO),而静态则是希望区别于某一具体Object而独立存在于某一特定类型的变量(到可以称之为该类型的全局变量,但个人感觉不很确切)。全局变量的概念显然过于宽泛,以至于我们说一个程序甚至是一个系统拥有一个唯一的变量变成可能,但final   or   static显然不是为其而设计的(当然可以模拟)。其次,阁下提到的有关于“全虚拟机只有一份,数据库连接池对象...”是设计模式中所谓单例模式的实际应用,该模式确实非常像所谓的全局变量的概念,但设计这样单个实例确实是因为在系统的整个生命周期中只需要一份该实例存在的缘故,更多的是突出概念而非实际应用,而全局变量则更多就是为了实际应用而生,这样就会导致许多不成熟的,不加思考的应用加于其上而导致黏糊的像意大利面条一样的代码。所以个人认为,依在下实在低微的学识实在不敢胡乱评说关于全局变量是否有实际意义这样巨大的课题,这样的课题还是留给那些专家去讨论吧。至于如何实际应用全局变量,我看,还是有则去之,无则加冕吧,实在要用偶也么的办法(不过自从使用C++/JAVA开始,全局变量的使用确实降到了一个极低的程度,也许是因为在下的代码写的还是太少的缘故吧,呵呵...)。

    12、static   变量可以使用,不要认为程序中出现了static成员或方法就是程序写的不好,用不用静态成员与程序写的好坏没有直接的因果关系,不要钻牛角尖。

    13、interface   Global     {     public   static   final       }

    展开全文
  • java多线程全局变量共享问题

    万次阅读 2018-07-17 20:14:09
    先看下面问题:多个线程访问全局变量x,然后将x与i累加,启动10个线程,想让每个线程的输出结果都是一样的55,但是实际不是的。 package ThreadTest; public class Counter { private int x =0; // 计数方法...

             先看下面问题:多个线程访问全局变量x,然后将x与i累加,启动10个线程,想让每个线程的输出结果都是一样的55,但是实际不是的。

    package ThreadTest;
    
    public class Counter {
    
    	private int x =0;
    	
    	// 计数方法
    	public void count() {
    		for(int i=0;i<=10;i++) {
    			x = x+i;
    		}
    		System.out.println(Thread.currentThread().getName()+"--"+x);
    	}
    	
    	public static void main(String[] args) {
    		// 定义线程实现接口
    		Runnable runnable = new Runnable(){
    			Counter counter = new Counter();
    			@Override
    			public void run() {
    				counter.count();
    			}
    		};
    		// 启动10个线程
    		for(int i=0;i<10;i++) {
    			new Thread(runnable).start();
    		}
    	}
    }
    

                实际输出是无规则的。

    解决方案一:

    package ThreadTest;
    
    public class Counter {
    
    	ThreadLocal<Integer> th=new ThreadLocal<Integer>(){
    		protected Integer initialValue() {
    			return 0;
    		}
    	};
    	// 计数方法
    	public void count() {
    		for(int i=0;i<=10;i++) {
    			th.set(th.get()+i);
    		}
    		System.out.println(Thread.currentThread().getName()+"--"+th.get());
    	}
    	
    }
    

    用ThreadLocal,输出结果是55,ok!

    由此可以证明,ThreadLocal为每一个线程保存每一个变量,而且每个线程拿到的都是自己的那一份。

    解决方案二:

    将全局变量局部化

    public class Count {
    
    
        public void count() {  
            int x =0;
            for(int i = 1; i <= 10; i++) {
                x=x+i;
            }  
            System.out.println(Thread.currentThread().getName() + "-" + x);  
        }  
    }

    每个线程都有一份自己的局部变量,因此不会产生线程问题。

    解决方案三:对象局部化

    public static void main(String[] args) {
           Runnable runnable = new Runnable() {               
               public void run() {  
                Count count = new Count();
                   count.count();  
               }  
           };  
           for(int i = 0; i < 10; i++) {  
               new Thread(runnable).start();  
           }  
    }

    每个对象都会有一个自己的全局变量。不会产生线程问题。

    展开全文
  • Java全局变量与局部变量 1)Java变量类型 Java语言支持的变量类型有:全局变量和局部变量。全局变量又分为类变量、实例变量。 (1)类变量:也称静态变量,也就是在实例变量前加了static 的变量。静态变量必定义...

    Java基础语法:4. Java全局变量与局部变量

    1)Java变量类型

    Java语言支持的变量类型有:全局变量和局部变量。全局变量又分为类变量、实例变量。

    (1)类变量:也称静态变量,也就是在实例变量前加了static 的变量。静态变量必定义在类中但独立于方法和语句块之外,静态变量可以通过ClassName.VariableName的方式访问。类变量被声明为public static final类型时,即常量,类变量名称一般使用大写字母。

    (2)实例变量:实例变量被定义在类中但在任何方法之外,没有static修饰。实例变量也叫对象变量,类的每个对象维护它自己的一份实例变量的副本。

    (3)局部变量:局部变量声明在方法、构造方法或语句块中。它在方法、构造方法、或语句块被执行的时候创建,执行完成后被销毁。它的作用域也局限于方法、构造方法或者语句块中。访问修饰符不能用于局部变量。

    2)类变量与实例变量的区别

    类变量是所有该类的实例化对象所共有的资源,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其所包含的实例变量的值改变,不影响其他对象中实例变量的值;

    3)代码验证

    代码:

    package com.test1;
    
    class JingAndShi{
    	public static int m;// 类变量
    	public int n;//实例变量
    }
    
    public class BianLiang {
    	private static String name;//name是静态的私有变量
    	public static final String COMPANY="上古科技";//COMPANY是常量
    	
    	private static void bank() {
    		String id="612450812468";//id是局部变量
    		name="小明";
    		System.out.println("姓名:"+name+"\t银行卡号:"+id);
    	}
    	
    	public static void main(String[] args) {
    		JingAndShi s1=new JingAndShi();
    		JingAndShi s2=new JingAndShi();
    		s1.m=2;
    		s1.n=3;
    		System.out.println("s1.m的值是:"+s1.m+"\ts2.m的值是:"+s2.m);//对象所有资源共享,所以s2.m=s1.m
    		System.out.println("s1.n的值是:"+s1.n+"\ts2.n的值是:"+s2.n);//对象私有,所以s2.n不等于s1.n
    		
    		BianLiang.bank();
    		System.out.println("姓名:"+name+"\t公司:"+COMPANY);
    		System.out.println("类名.静态变量名:"+"姓名:"+BianLiang.name+"\t公司:"+BianLiang.COMPANY);
    		
    	}
    }
    

    运行结果:

     

    展开全文
  • JAVA全局变量

    万次阅读 多人点赞 2018-11-19 13:59:09
    java中的全局变量是放在静态方法区中的,所有的实例对象共享同一份全局变量。所以一旦对某个类实例化后对其中的全局变量做出修改,那么其他的实例其中的全局变量值也相应的会被修改。 定义了一个测试类如下: ...
  • 1Java对象的存储位置 String aa = new String(); new创建的对象存储在堆内存中; aa这个局部变量存储在栈内存中; 2.Java中常量的存储位置 常量存放在常量池中,而常量池在堆内存中 3.Java中局部变量的存储位置 ...
  • Java多线程共享全局变量问题

    千次阅读 2015-10-24 20:58:46
    现在安全问题,在我们做开发时只要涉及多线程都是属于必须考虑的问题,但...对象局部化了,每个对象都有自己的全局变量,其实有多种解决方案这里我也只是给出了我自己的解决方式 总结: 用线程需小心 
  • 同时这四个对象形成了四个级别的共享对象存放地,即应用程序对象中的共享对象全局性的,在整个应用程序的生命周期内有效(当然主动去掉除外),属于所有的上网用户;会话对象中的共享对象是在一个会话期
  • MapReduce job 如何实现全局共享数据背景:在写MR的时候,经常会遇到这样一种情况,如何在将参数传递给map或reduce已进行下一步的处理。这时候就涉及到了全局变量。但是在MapReduce中直接使用代码的全局变量是不...
  • * 【***全局静态变量是属于 类 的,不同对象之间是共享的,但是不同类之间是隔离的】 * 如果达成runnable的jar包运行,每个jar是一个进程,不同进程之间也是隔离的! * * 只要类中的全局变量不是静态...
  • JAVA全局变量和局部变量简单介绍

    千次阅读 2013-05-23 21:38:32
    JAVA全局变量和局部变量与在php,asp.net中的用法与性质都差不多,下面我来给大家详细介绍JAVA全局变量和局部变量介绍。 全局变量:也叫成员变量,是指在类中定义的变量,它在整个类中都有效。全局变量又可分为:...
  • 先看下面问题:多个线程访问全局变量x,然后将x与i累加,启动10个线程,想让每个线程的输出结果都是一样的55,但是实际不是的。 package ThreadTest; public class Counter { private int x...
  • java中实现全局变量的功能

    万次阅读 2014-10-22 16:42:50
    在一个程序中需要用到全局变量(在多个class之间共享数据),请问如何定义具有这种功能的变量?或者是否有其他的方法解决多个class之间的数据共享(尽量简单实现)。
  • java全局变量引起的并发问题

    万次阅读 2016-02-25 11:09:11
    最近刚完成了一个短彩信群发平台的开发工作,系统采用springmvc+hibernate+jdbctemplate+mysql架构。其中遇见许多问题,闲暇之余记录下来以避免在后续项目中再犯... controller.java代码:  ........  @Autowired
  • java线程共享变量与静态变量

    千次阅读 2013-04-05 11:22:22
    以下三种情况说明java全局变量与静态变量在线程间的关系 情况一: /** * 两个线程对【两】个对象操作,这两个对象的类中的【静态变量在线程间共享】 * * @author thinktown * */ public class Test1 ...
  • Java面向对象

    千次阅读 2016-05-29 14:34:23
    java 学习:面向对象: 面向对象的基本概念: java是面向对象的程序语言,c是面向过程的程序语言,各有特长。 - 面向对象的三个主要特征: 封装性: 对外部不可见,可以保护程序中的某些内容。 继承性:扩展功能。 ...
  • Java实现面向对象编程

    万次阅读 2018-07-17 16:18:06
    1.1用面向对象设计电子宠物系统... 14 1.1.1为什么使用面向对象... 14 1.1.2使用面向对象进行设计... 15 1.2通过创建对象实现领养宠物功能... 17 1.2.1创建类的对象... 17 1.2.2构造方法及其重载... 23 1.2.3...
  • Java 利用POI对象 SXSSFWorkbook 导出Excel

    千次阅读 2019-03-01 17:15:40
    Java 利用POI对象 SXSSFWorkbook 导出Excel
  • Java-面向对象

    千次阅读 2020-02-14 16:14:48
    3:satic修饰的成员被该类型的所有对象共享. 根据该类创建出来的任何对象,都可以访问static成员.(狗天生就吃屎.) 剧透:表面上通过对象去访问static成员,其本质依然使用类名访问,和对象没有任何关系(通过反编译...
  • Java面向对象(知识点整理)

    万次阅读 多人点赞 2021-02-22 08:53:55
    文章目录面向对象类与对象匿名对象创建对象的内存分析栈(stack)堆(heap)方法区PC寄存器本地方法栈内部类成员内部类局部内部类匿名内部类静态内部类包装类拆箱和装箱操作字符串转换基本数据类型和包装类型的区别...
  • Java面向对象基础

    万次阅读 多人点赞 2015-11-05 16:33:28
    java语言是面向对象的 计算机语言的发展由面向机器向面向对象发展的,是越来越符合人的思维习惯的。   符合人类思维习惯程度 低 → 高  面向机器 汇编语言 面向过程 C语言 面向对象 Java...
  • Java全局变量争议小集合

    千次阅读 2014-06-16 00:21:27
    2、类中的任何static public的成员变量都是全局共享的。 3、JAVA中不应该有所谓全局变量的概念,全局变量严重影响了封装和模块化,所以如果你的程序中需要所谓的全局变量,那一定是你对程序的设计出了问题。
  • java中的全局变量

    万次阅读 2009-06-10 11:26:00
    正在使用NetBeans做一个稍大点的程序,刚刚学习使用,感觉程序中需要用到全局变量(其实java中是没有全局变量这个概念的)。 在网上查了不少的资料,得到一点点体会: 首先,java中是没有全局变量这个概念的,java...
  • 望该类所有的对象共享同一个成员。此时就是static大显身手的时候了。  Java中被static修饰符修饰的成员称为静态成员或类成员。它属于整个类所有,而不是某个对象所有,即被类的所 有对象共享。静态成员可以使用...
  • Java类和对象知识点的整理

    千次阅读 多人点赞 2019-04-14 18:00:01
    本次博客目的是为了理解面向对象的思想,掌握面向对象的基本原则以及 Java 面向对象编程基本实现原理,熟练使用封装、继承、多态面向对象三大特性。仅是博主本人总结,可能会有很多不足之处,希望读者可以有目的的...
  • Java基础——面向对象(一)封装

    千次阅读 多人点赞 2019-01-01 22:05:14
    Java基础——面向对象(二)继承 Java基础——面向对象(三)抽象类 Java基础——面向对象(四)接口 Java基础——面向对象(五)多态 Java基础——面向对象(六)内部类 Java基础——面向对象(七)Object类 ...
  • 在activity之间数据传递中还有一种比较实用的方式,就是全局对象application Application和Activity,Service一样是Android框架的一个系统组件,当Android程序启动时系统会创建一个Application对象,用来存储系统...
  • 1.成员变量和局部变量:通常将类的属性称为类的全局变量(成员变量),将方法中的属性称为局部变量。  全局变量声明在类体中,局部变量声明在方法体中。    举个例子说明全局变量和局部变量: public class ...
  • 我们在学习使用Java的过程中,一般认为new出来的对象都是被分配在堆上,但是这个结论不是那么的绝对,通过对Java对象分配的过程分析,可以知道有两个地方会导致Java中new出来的对象并不一定分别在所认为的堆上。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 123,626
精华内容 49,450
关键字:

java全局共享对象

java 订阅