例如有两个用户A,B同时在线访问一个jsp页面;
假如A执行以下代码:
Constant.ATTRIBUTE=1;
doSomething();//此方法很耗时
System.out.println(Constant.ATTRIBUTE);就在A执行很耗时的方法doSomething()时,用户B执行了以下代码:Constant.ATTRIBUTE=2;
doSomething();//此方法很耗时
System.out.println(Constant.ATTRIBUTE);请问执行完后用户A看到的Constant.ATTRIBUTE的值为1还是2  
用户B看到的Constant.ATTRIBUTE的值是什么?

解决方案 »

  1.   

    补充:
    public class Constant{
      public static int ATTRIBUTE=0;
    }
      

  2.   

    可以肯定地说:不安全!
    如果你用constant,最好用类来实现,比如。
    public class Constant
    {
    private static final String name = "elan";
    public static getName()
    {
    return name;
    }
    }
    不要使用常量接口!
      

  3.   

    hohoho~~
    public static String getName()
    {
    return name;
    }
      

  4.   

    除了long和double不安全,原子型安全。引用型没有仔细考虑过。
      

  5.   

    > 请问执行完后用户A看到的Constant.ATTRIBUTE的值为1还是2  
    > 用户B看到的Constant.ATTRIBUTE的值是什么?因为是 A 先执行的赋值,B 后执行的赋值(假设二者的 doSomething() 中都不再有对 Constant.ATTRIBUTE 的赋值),那么,A 和 B 最后看到的都是 B 的赋值:2。至于这算不算“线程安全”,这要看怎么说。所谓安全与否,是有前提的。如果 A 预期的逻辑是在其整个执行过程中,Constant.ATTRIBUTE 的值完全由它自己作主,不应该由别人*偷偷*修改,那么现在这种做法显然就是*不安全*的;反之,如果 A 并没有这种预期,甚至,A 就是要在这段时间中等待 Constant.ATTRIBUTE 的值发生变化(比如信号灯应用),那就谈不上*不安全*了。最后说说楼主给出的题目:静态变量是否线程安全
    我认为,“是否线程安全”跟“是否静态变量”是两个没有直接关系的事情。说远一点,所谓“静态变量”其实可以理解为一个 Class 对象的成员变量。
      

  6.   

    静态变量肯定不安全的在使用变量是,如果需要进行多个线程之间进行通信,使用同步机制;
    如果需要隔离多个线程之间的共享冲突,可以使用ThreadLocal;静态变量肯定是不行的
      

  7.   

    首先要理解,jsp其实也是一个servlet,如果这个理解的话,就应该知道,在servlet里面只有service(dopost doget ...)方法内部才是线程安全的