Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类线程安全的非抽象方法_Java_Synchronization_Abstract - Fatal编程技术网

Java 抽象类线程安全的非抽象方法

Java 抽象类线程安全的非抽象方法,java,synchronization,abstract,Java,Synchronization,Abstract,我有一个带有非抽象方法的抽象类。我想知道这些非抽象方法在默认情况下是否是线程安全的 为了让问题更清楚,这里有一个例子 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

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

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

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

如果猫和狗都想同时生存,Java默认会照顾它吗?或者我应该将Animal.survive()方法设置为同步的吗?

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

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


方法前面的put中的单词abstract意味着您必须在子类中重写它。

好吧,根本没有问题,因为Dog和Cat是独立的对象-->没有同步问题

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


foo state非常重要。

您的代码似乎是非编译代码,并且完全混乱。很抱歉,我不打算给出编译代码。我只是想让它恰当地解释这个问题。谢谢你帮我。这正是我的问题。狗和猫的对象是独立的吗?它们不是使用动物类的相同survive()方法吗?如果使用相同的数据,即字段,而不是使用相同的方法,则会出现同步问题。Cat和Dog继承survive方法,但survive方法仅在Cat对象的字段(即foo)上起作用,而在Dog对象中仅在Dog对象的foo上起作用。所以没有问题:-)如果foo是静态的,那么我们就会有问题,因为两个对象现在可以同时访问相同的数据结构。这就是问题的关键:检查不同的对象是否同时访问了某些数据-如果是,请使用某种同步机制。你能用一个例子解释一下吗?我对这些共同的问题还很陌生,我想说清楚。