0

我有一个带有非抽象方法的抽象类。我想知道这些非抽象方法是否默认是线程安全的?

为了让问题更清楚,这里有一个例子

public abstract Class Animal {
  private List foo;
  non abstract method survive() {
    //bla bla bla
    foo++;
    foo = foo * 2
    foo = nul
    //bla bla bla
  }  
  abstract method eat();
  abstract method sleep();
}

public class Cat extends Animal {
  eat();
  sleep();
}

public class Dog extends Animal {
  eat();
  sleep();
}

//etc etc

如果 Cat 和 Dog 都想同时生存,Java 会默认处理它吗?或者我应该使 Animal.survive() 方法同步?

4

4 回答 4

1

抽象类方法在并发访问方面没有任何特殊之处。如果您在非抽象方法中处理静态资源,那么您应该使其同步以避免任何并发访问问题。

于 2013-05-10T15:16:05.790 回答
0

如果A类扩展了B类,那么B类的所有对象都可以使用A的公共非抽象方法。显然,你可以在B中重写这个函数,但如果你不这样做,那就没有问题了在使用 A 中的(公共的,非抽象的)函数时。

A中的抽象字放在方法前面意味着您必须在子类中覆盖它。

于 2013-05-10T15:16:17.520 回答
0

嗯,完全没有问题,因为 Dog 和 Cat 是独立的对象 --> 没有同步问题...

于 2013-05-10T15:17:45.510 回答
0

“编写线程安全代码的核心是管理对状态的访问,尤其是对共享的可变状态的访问。” - Java 并发实践 -

foo 状态非常重要。

于 2013-05-10T15:33:47.280 回答