请看如下代码,对类中的变量尽量封装起来,设置为私有变量,并提供其getter/setter访问器,是JAVA中的一条比较重要的规范。对于基本数据类型的get方法直接返回该变量即可。而引用类型则最好在get方法中返回该对象的clone对象。为的是防止外部对象获得该对象的引用,从而破坏封装性。这一点很好,但是在看一些代码中发现,很多引用类型变量的get方法添加了synchronized关键字,其作用在哪里,在这里有必要实现同步功能吗?
public class Department {
    private int id = null;
    private String deptname = null;
    private String[] emp = new String[]{};
public String getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getDeptname() {
return deptname;
}
public void setDeptname(String deptname) {
this.deptname = deptname;
}
public synchronized String[] getEmp() {
return emp.clone();
}
public void setEmp(String[] emp) {
this.emp = emp;
}

}

解决方案 »

  1.   

    赞同1楼的说法。加上nchronized关键字是为了实现同步访问,而实现同步是为了实现对临界区的同步访问,避免成员变量被访问时的不一致。
      

  2.   

    个人理解:在多线程程序中,当多个线程同时访问同一数据时,nchronized 可避免产生冲突
      

  3.   


    反了。
    lz看看clone做什么的,怎么实现的就知道为什么要加synchronized了。
      

  4.   

    clone是复制当前对象,产生另一个实例,可这个和synchronized有什么必要的关联吗?可否解释一下,我查阅了API和一些资料,还是不清楚!
      

  5.   

    API上的一段话.此方法返回的对象应该独立于该对象(正被克隆的对象)。要获得此独立性,在 super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改。这通常意味着要复制包含正在被克隆对象的内部“深层结构”的所有可变对象,并使用对副本的引用替换对这些对象的引用。
      

  6.   

    有道理,set是设置数据,既然是设置,就应该对数据互斥访问,加上synchronized关键字,保证一致性。
      

  7.   

     super.clone 返回对象之前,有必要对该对象的一个或多个字段进行修改,get没有必要,Set或许有
      

  8.   

    保证所有对象的成员函数中至多只有一个处于可执行状态,从而避免了类成员变量的访问冲突,很有道理,另外,get有必要,set没必要