有一个java面试题求大神解读

12-10-20 cugxw
                   

public class Point{  
public int x,y;  
  
public Point(int x, int y){  
x=0;  
y=0;  
}  
  
public Point(Point p){  
this.x=p.x;  
this.y=p.y;  
}  
}  
<p>

上面这个类是线程安全的吗,为什么?

这个题目有人在ITEye论坛上问的,至今还没弄明白,求大神指教!

                   

6
banq
2012-10-20 12:39

2012-10-20 10:16 "@cugxw"的内容
public Point(int x, int y){

x=0;

y=0;

}

...

这里x不是this.x 赋值给输入参数x. 故这个构造函数无效。

另外一个构造函数将point对象边界内两个字段分别拆开,值或值对象离开主体,失去控制,这两个值之间可能发生修改不一致情况。

banq
2012-10-20 12:45

因为java是以类为第一公民,如果内含字段,也就是有状态,简称有态,在多线程环境大多数存在线程不安全,只有以函数为第一公民,不存在可变性的函数语言才缺省真正是线程安全的。

SpeedVan
2012-10-20 17:23

2012-10-20 10:16 "@cugxw"的内容

public class Point{

public int x,y;

public Point(int x, int y){

x=0;

y=0;

}

public Point(Point p){ ...

关键在“x/y声明是public”和“第二个构造函数”,也就是说Point类型,它是非值类型(即非不变类型)。

考虑如下情况:

程序运行到第二个构造函数的this.x=p.x和this.y=p.y之间,p在当前线程发生改变(p.y=?),那么构造出来的p是非期望的。

banq
2012-10-20 20:52

关于这个问题有两个意见:

Are java constructors thread safe ?

Immutability doesn’t guarantee thread safety

我比较同意后者,我的编程习惯已经不把Java当作缺省线程安全的,而是相反,所以,如果我要求线程安全,就显式去保证,比如给字段x y加上final,确保不变性,如果不加final,好像是不变,但还不是线程安全的。

这个题目关键还在public int x,y;的public, 表示x y可以被外界访问,如果是private final int x, y;就是真正安全发布publish了,见IBM的文章:http://www.ibm.com/developerworks/java/library/j-jtp0618/index.html

[该贴被banq于2012-10-20 20:57修改过]

2Go 1 2 下一页