论坛首页 招聘求职论坛

阿里巴巴电面整理(二)

浏览 23307 次
该帖已经被评为精华帖
作者 正文
   发表时间:2010-07-05  
 
  •  

                (这样的处理,必须将action类的scope配置成property)

 

           OK,这里说了配置部分,但是,这里有一个问题, 就是Spring管理Action,如果按照第一方式,那么只要通过  

           scope="property"来配置为每个请求创建一个Action实例。


lz这里写错了,scope="property",这个单词不是这样写的,是scope="prototype",小心误人子弟

0 请登录后投票
   发表时间:2010-07-05  
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 {
    o = appContext.getBean(beanName);  // 注1: 有正确配置的情况下,在这里结束new instance
} catch (NoSuchBeanDefinitionException e) {  // 注2: 在spring找不到相关配置时,它又转入了默认的struts构建方式
    Class beanClazz = getClassInstance(beanName);
    o = buildBean(beanClazz, extraContext);
}

-->

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字节码相关部份.

顶~~建议LZ看看基础知识。个人感觉应该是实际经验有,个人思考有,但是基础的并发相关概念不是很明白。

0 请登录后投票
   发表时间:2010-07-05  
网址的后缀是.aspx?,楼主你取个名字也太累了吧.action或者.do蛮好的呀,呵呵
0 请登录后投票
   发表时间:2010-07-05  
struts1中的action是单例的,因为数据存储是使用actionForm来存储的,action单例即可,struts2中的action是多例的,因为此时struts是将页面表单数据存在action的域里,如果是单例的话势必造成数据混乱,另外不是做广告,在传智上的视频讲解struts的时候就有说到这个问题,因为看的时候距离现在有点时间了,也不太清楚是struts1还是struts2的时候讲的
0 请登录后投票
   发表时间:2010-07-05  
忘了说了,因为spring默认都是单例的,因此在配置struts2的时候需要加配置不以单例形式实例化,呵呵
0 请登录后投票
   发表时间:2010-07-06  
scope="prototype"
0 请登录后投票
   发表时间:2010-07-06  
好人。。。
0 请登录后投票
   发表时间:2010-07-06  
我想打面试官。 具体的开源产品提问, 很伤人。
0 请登录后投票
   发表时间:2010-07-06  
sdh5724 写道
我想打面试官。 具体的开源产品提问, 很伤人。

看看框架的源码还是不错的,设计思想以及类、方法的命名方式都值的借鉴的!
0 请登录后投票
   发表时间:2010-07-06  
招聘版面竟然有这么多篇关于阿里的帖子,这一年似乎阿里和淘宝越来越多自我宣传的味道,网站、书刊、博客和围脖到处都能听到自诩某某架构师的称谓,并且将自己在公司的不满宣泄于公众,某某架构师不服某某架构师,某某架构师的架构不被采纳,我呆过两家八十年代就起家的软硬件公司,也未见几个敢称呼自己为架构师的,看看这种根本不能测出人的自学素质的面试题又不知处于哪位“架构师”之手。

阿里淘宝产品市场做的不错,但技术远未为优秀,希望能少听见写年轻架构师的张狂,多出点能走向世界的优秀产品。
0 请登录后投票
论坛首页 招聘求职版

跳转论坛:
Global site tag (gtag.js) - Google Analytics