锁定老帖子 主题:阿里巴巴电面整理(二)
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2010-07-04
楼主,就凭你这个贴,就知道你能力不错
|
|
返回顶楼 | |
发表时间:2010-07-04
感谢楼主!
|
|
返回顶楼 | |
发表时间:2010-07-04
starfeng 写道
gogole_09 写道
对于这点的原因,我还是没有弄清楚,为什么按照第2种方式配置,不用指定scope,就会自动的为每个action创建一个实例?(希望懂的朋友,可以指点指点)
struts2与spring集成通过plugin "struts2-spring"实现, 这个插件提供了一个新的对象工厂: org.apache.struts2.spring.StrutsSpringObjectFactory, 并且, 它通过struts.objectFactory=spring来激活这个新的工厂. 当struts2要创建action时, 通过如下方式切入到spring: buildAction-->buildBean--> try { --> bean = autoWiringFactory.autowire(clazz, AutowireCapableBeanFactory.AUTOWIRE_CONSTRUCTOR, false); 所以, 你第二次方式做的, 每次都会建新的实例.
但, 我要说明一点的是, 第二种方式是一种相对低效的方式, 即然用spring就全部用spring的方式去配你的action比较好.
gogole_09 写道
我们都知道线程安全是指什么,我的理解是, 当一个类的“状态”(实例变量)被多个线程所修改时,
那么这个类的状态的“正确”性得不到保证,我们就可以理解成线程安全出现。 当然,如果一个没有状态的类,那么它永远都是线程安全的。 再深入一点来看, 我们从Java虚拟机的层面来看这个问题,答案就很明朗了: Java 程序在运行时创建的所有类实例或数组,都存放在同一个堆中,而一个JVM实例中只存在一个堆空间, 因此,它被所有的线程共享着,这样的情况下,就可能出现,多个线程访问对象(堆数据)的同步问题了。
虽然你这里看起来每句话都是对的, 但却又有点没解释到根本上. 类的状态...你发明了一个不太好的词, "当一个类的“状态”(实例变量)被多个线程所修改时", 漏洞有点多, 多个实例呢, 这个状态怎么算? 通常我们只会说实例的状态. 换个说法可能更好理解一点: 同一实例的属性同时被多个线程修改 (注意不是调用)
所以, 实例没属性,自然也没法被"修改", 自然也是线程安全 每个实例只被一个线程修改(也即每个线程自已创建实例), 自然没法被"多个", 也是线程安全 加上同步关键字, 没法被"同时", 自然也是线程安全 采用锁, 没法被"同时", 也是线程安全 ...
深入部份你这讲了一半, 还有另一半: 深入JVM去理解, 要抛开OO, 抛开public, private之类, 不然, 你会想当然的认为某些安全是理所当然的. 比方, 为什么方法内的东西就是线程安全? 如下: public void method() { int i = 0; i = i + 1; } 凭什么 i = i + 1就会一定由0变成1, 而不是由0变成2或3... 当然, 本身原因也简单, 只不过不要从public/private的角度去理解为: 外部访问不到所以安全. 要知道jvm这个层面是没有这个东西的.
首先,JVM中只有一块堆也只有一块栈,所以"一块"不是全不安全的理由, 其原因在用法上面. 在某一时刻,实例有属性状态,方法运行状态, 属性的放堆, 方法的放栈. 方法的运行在栈中, 多个方法的同时运行要依靠多个线程(这里不讨论进程), 而线程为保证方法相互不干扰, 会为每个方法开辟独立的栈区, 即压栈. 因而对于方法来说, 都在属于某一线程所在的栈中,因为方法间不会相互干扰, 因而没有线程问题. 虽然没有线程问题, 但是呢, 线程间也没法通过栈来沟通信息. 实例属性, 就有点不同了, 每个线程不会再copy一份新的, 多个线程会共用同一个, 所以, 线程问题就出来了.
不想再深讲下去了, 感觉后面的话题一问接一问可以深太入太多. 有兴趣的看大学教材的线程部份,以及网上找文章JVM字节码相关部份.
非常感谢你非常详尽地解答了我的疑问,而且附上了源代码,很受用。 另外,对于线程安全,我接受你指出的我解释中的问题,用词确实不太严谨。 并多谢你补充JVM部分的内容。 |
|
返回顶楼 | |
发表时间:2010-07-04
lz真是个有心人
|
|
返回顶楼 | |
发表时间:2010-07-04
gogole_09 写道
<bean id="LoginAction" class="yaso.struts.action.LoginAction"> <property name="loginDao" ref="LoginDao"/> </bean>
LZ 不觉得这段配置有问题吗? |
|
返回顶楼 | |
发表时间:2010-07-04
風一樣的男子 写道
gogole_09 写道
<bean id="LoginAction" class="yaso.struts.action.LoginAction"> <property name="loginDao" ref="LoginDao"/> </bean>
LZ 不觉得这段配置有问题吗? 没加scope? |
|
返回顶楼 | |
发表时间:2010-07-05
多谢LZ。
祝LZ拿到OFFER |
|
返回顶楼 | |
发表时间:2010-07-05
LZ面的哪个部门?还考Struts?
|
|
返回顶楼 | |
发表时间:2010-07-05
gogole_09 写道
風一樣的男子 写道
gogole_09 写道
<bean id="LoginAction" class="yaso.struts.action.LoginAction"> <property name="loginDao" ref="LoginDao"/> </bean>
LZ 不觉得这段配置有问题吗? 没加scope? Spring 里的 bean 默认都是单例的,这个 struts2 的 Action 能单例吗? |
|
返回顶楼 | |
发表时间:2010-07-05
風一樣的男子 写道
Spring 里的 bean 默认都是单例的,这个 struts2 的 Action 能单例吗?
eg: public class DoNothingAction extends ActionSupport{ private static final long serialVersionUID = -4211885847645132411L; public String execute() throws Exception{ return SUCCESS; } } 配置: <action name="*Redirect" class="doNothingAction"> <result>/{1}.jsp</result> </action>
|
|
返回顶楼 | |