日期:2014-05-20  浏览次数:20684 次

关于在JSP中的一个方法 同时只允许一个客户访问应该怎么办?
关于在JSP中的一个方法   同时只允许一个客户访问应该怎么办?
public   synchronized   String   getComplieResult(SubmitBean   submitBean,UserBean   user,FormatFile   formatFile,String   language)
{
      p=Runtime.getRuntime().exec( "gcc   "+ "\ " "+file.toString);
      p.waitFor();
      .....  
      .....
}
这个方法   已经加了   synchronized  
可是为什么老是可以在任务管理器中中看到好几个   gcc.exe在运行???
难道不是一次只有一个人访问的吗??

还有就是那个GCC     也真晕,GCC编译怎么还要这么长时间??系统没调度??
怎么会出现这个GCC     还不会结束???
编译应该是很快的撒


------解决方案--------------------
hehe, 这个错误比较常见。

你给 getComplieResult() 加上 synchronized,那么,对“同一个”对象的 getComplieResult() 调用会被同步。但在 Web 环境下,不同的 HTTP request 访问的可能是不同对象的 getComplieResult(),所以就失效了。
------解决方案--------------------
楼上正解~~

你要是想在分布式环境下保证同一时刻下只有一个客户访问,可以用设计模式的单例(Singleton)模式,即让这个方法所在的类成为单例类,也就是说只能生成一个实例,然后此方法再用synchronized关键词保证同一时刻只能同一个客户在调用。

Good luck!
------解决方案--------------------
public class Test{
private static Test test=new Test();
private Test(){}
public static Test getTest(){return test};

public synchronized String getComplieResult(SubmitBean submitBean,UserBean user,FormatFile formatFile,String language)
{
p=Runtime.getRuntime().exec( "gcc "+ "\ " "+file.toString);
p.waitFor();
.....
.....
}

}

//外面调用
Test.getTest().getComplieResult(...);