struts1单例问题
发布网友
发布时间:2024-10-02 17:16
我来回答
共2个回答
热心网友
时间:2024-10-11 04:26
这里面涉及几个方面的问题,一个是tomcat服务器的多线程单实例,另一个是单例的线程安全问题。
先理解下为何会有线程不安全的问题,比如有一个类Person 有个属性是name,线程1修改了这个属性的name,要进行存入数据库操作的时候,线程2又修改了这个name,这样线程1就存入了一个线程2修改过的数据了。
再了解下tomcat的工作机制,tomcat 是多线程 单实例, 所谓的多线程是指 多个tomcat的访问者都有自己的一个的新线程,线程访问进程的资源,如果某个资源(比如:类) 是单例模式的,则多个线程都会访问到同一个类的对象。关键点在这里,如果这个单例的类中有全局变量,那这个单例就是线程不安全的,如果你的单例类没有全局变量,每个线程去访问单例类中的方法,是不会出现线程安全问题的。
比如:
Java code
public class SampleAction extends Action {
private String user = null; ...
}
如果有多个用户上来访问这个SampleAction,而且每个用户都要来修改user属性或者说是要对user进行某种操作,那么这就是一种线程不安全的情况。
但是,如果你不定义这个user属性,也不定义任何其他属性,那么这个SampleAction就不存在线程不安全的问题。还有种情况,如果你这个属性定义成final的,只是在初始化的时候进行一次赋值,以后所有的操作都只是读取、而不会修改这个属性的值,那么也不会有线程安全的问题。
再比如,有一个类User,你每次使用这个类的时候都是new出来的,那么这个类一定是线程安全的吗?也不一定。
Java code
public class User {
private static String name = null;
public User(String name) {
User.name = name;
}
}
对于这个User类,即使你每次都是new一个新的,它也不是线程安全的。
因此通过上述的理论,回头看下你提出的问题,在struts1中,多线程是可以同时访问单例的actionA、actionB,因为在Struts1中的action是没有定义全局变量的,所以不会出现线程安全的问题。
热心网友
时间:2024-10-11 04:31
不同线程访问同一个对象的同一个方法,是互不影响的。
就是说前一个用户访问actionA没有访问完,后一个用户也可以同时访问,且互不影响。
但是如果方法上加了 synchronized 那么第二个访问的会等待第一个访问的完成才能继续。
所以不要在方法上加入 synchronized 如果你不知道你在干什么。
方法中的变量是局部变量,同时访问方法的话,会产生多个局部变量。
类中的变量是成员变量,是共享的,所以Action中要避免使用成员变量。