【问题标题】:Session - servlets, in a sevlet i set a static variable to something and this remains the same for all the sessions会话 - servlet,在 servlet 中设置了一个静态变量,并且对于所有会话都保持不变
【发布时间】:2014-04-11 15:05:07
【问题描述】:

我有一个简单的 Jsp 页面,它访问 servlet,在 servlet 中我调用另一个类的方法,在这个方法中我全局声明一个静态变量并为其设置一个值,然后 servlet 的任务就结束了,所以控制权返回到 jsp 页面(或返回到我将请求和响应转发到的页面)。

所以刚刚发生的事情被称为会话???

为该静态变量设置的值对于接下来的所有会话保持不变!!为什么会这样。 dint 较早的会话结束?如果它已经结束,那么为什么我设置的静态变量的值仍然只在我后续的会话中保持不变?如果我错了,请纠正我。帮我学习! stackoverflow 从来没有让我失望过!!!!提前致谢

【问题讨论】:

  • 所以你不知道静态变量是什么?也许您现在还不应该使用 JSP。去阅读解释这些事情的基本教程,否则你将无法理解任何东西。
  • 嘿卡亚曼!!我知道 wat 是一个静态变量,我的意思是我知道它是一个变量,它是其类的所有对象的单个副本。哦,等一下,我知道你想说什么!!一旦会话结束,我创建的对象或我设置为静态变量的值不会被销毁!????
  • 你是对的。试着自己回答你的问题。大多数时候你都会得到它:)
  • 只有会话变量在会话结束时死亡。静态变量存在于类中,而不是会话中。
  • 哦!我从来不知道这个!我相信一旦会话结束,对象就会被破坏!!你能帮我知道解决这个问题吗?我应该在使用它后将我的变量重置为之前的值吗?为下一次会议做好准备?这是我唯一的办法吗??

标签: java jsp session servlets


【解决方案1】:

static 类中的字段将一直存在,直到类本身被卸载并被垃圾回收。因此,一个 serlvet 中的 static 字段不仅会存在于所有会话中,还会存在于整个应用程序中,在这种情况下,直到 Web 应用程序被取消部署。

事实上,在 servlet 中包含任何字段是不明智的,除非该字段在初始化后无法修改,或者它是由容器(如 EJB 或 CDI bean)注入的。这是因为单个 Servlet 实例将用于处理对服务器的多个请求,因此即使您的 servlet 中有一个非static 字段并且您通过请求对其进行更新,它的值也可以修改两个或多个请求同时发生。尽量将变量保持在尽可能短的范围内,例如,仅在方法内部。

更多信息:


从 cmets 看来,您真正的问题是关于支持跨多个线程同步的设计。更好的选择是创建一个将在您的线程之间共享的对象实例,然后使用finalstatic 字段来处理同步:

class MyClass {
    final Object lock = new Object();
    //other fields in the class...
}

class Multijobs {
    class Job implements Runnable {
        MyClass myClass;
        public Job(MyClass myClass) {
            this.myClass = myClass;
        }
        @Override
        public void run() {
            //handle the job here...
            //using the synchronization point
            synchronize(myClass.lock) {
            }
        }
    }
    static final int NUM_THREADS = 10;
    public void executeSeveralJobs() {
        ExecutorService executorService = Executors.newFixedThreadPool(NUM_THREADS);
        MyClass myClass = new MyClass();
        executorService.execute(new Job(myClass));
        executorService.execute(new Job(myClass));
        //initialize the jobs and add them to the ExecutorService
        //...
        executorService.shutdown();
        //...
    }
}

【讨论】:

  • 嗨,门多萨,我在 servlet 类中没有静态变量。我在servlet调用的类中有它,这仍然是你解释的同一个问题??
  • @VasanthNagKV 如果是关于static 字段,那么是的。
  • 哦,谢谢!但是我在这里的情况有点困难,我必须将字段设为静态,因为声明它的类被许多线程访问,并且每个线程都在创建这个类的一个对象并检查静态变量的值。这些中只有一个线程(赢得第一场比赛的线程),更改该线程的值并执行 task1 ,所有其他线程只是检查该值并决定执行 task1 或 task2 。希望我在解释我的情况时很清楚!
  • @VasanthNagKV 为什么不使用此对象的单个实例并在finalstatic 字段上进行同步?
  • @VasanthNagKV 不,只需在您的方法中创建此类的单个实例,然后在创建线程时(通过传递Runnable,手动创建Thread,使用ExecutorService 或其他其他方式)传递此对象实例(从不单例)并使用将由所有线程共享的 final 字段作为同步点。
猜你喜欢
  • 2013-07-16
  • 1970-01-01
  • 1970-01-01
  • 2015-08-12
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多