本文共 1510 字,大约阅读时间需要 5 分钟。
项目快做完了,在自己偶然的测试中发现了一个问题,程序中有两处用到了全局变量,这样不同的用户点击就会修改全局变量的值,导致查看的结果与预期大相径庭,后来网上查了下,遇到这样的问题还不少,最后得出的结论是:禁用全局变量,或者只使用final static的全局变量,只读取,不修改。
下面引用某一篇贴子里面的内容:
想要实现类似全局变量非得用静态方法吗?多用户同时提交的冲突怎么解决呢?
比如我要定义一个ArrayList类型的全局变量,要在程序里几个互不相关的方法里操作它。用静态变量或静态方法的话,当A、B两个用户同时操作时,A向ArrayList插入2个对象;B插入3个对象。那当A/B提交时ArrayList里就有5个对象了。。请问有什么办法既可以实现类似全局变量的功能,又可以避免多用户同时操作的冲突呢?
某大牛的回复:
对于你来说最多的答案应该是 Session[.....]
不过,我不会使用这类东西。让我们退回到你说的static变量看看,可能你不知道(!),如果web应用部署在空间商虚拟主机上,应用程序进程进程经常因为服务器或者iis或者asp.net系统维护功能被回收(重启),于是static变量、Session集合、Application集合等都“丢失”了。这是你在自己的电脑上写点小程序时所想不到的,你应该已开始就花100、200块钱租一个空间一边开发一边把asp.net应用放到真正的外部服务器上去测试,才能发现这类问题。 面对这类问题,如果你要求开发一个稳定的应用程序,你就不会轻易把什么数据依赖于static、Session集合这种方式保存,而是会考虑数据持久化、Cache加速这类机制。当然,专业开发人员从客观的生产服务器的特性为编程基础,而初学者只要在自己的电脑为基础学点编程语法可能就满足了。
/** * 本例演示:对于电子商务网站销售商品,多用户并发抢购一种商品时候发生的事情。 * 它说明一个问题,可能你先点了,但不一定抢购得到。宏观上是先来先执行,微观上是虚拟机先择谁执行谁。 * 用java实现的话,多用户点击相当于多线程。但多线程如何调度(排队)执行的?他是由虚拟机来实现的,应用程序无法控制。 * * @author chengzhong * */public class TestNum { static int n=100;//库存 /** * @param args */ public static void main(String[] args) { for(int i=0;i<110;i++){ new Thread(){ public void run(){ try { TestNum.sub(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } } public synchronized static void sub() throws InterruptedException{ n-=1; if(n>0){ System.out.println(Thread.currentThread().getName()+":"+n); }else{ System.out.println(Thread.currentThread().getName()+":没抢到!"); } //Thread.sleep(500); }}
转载地址:http://yuxci.baihongyu.com/