0
abstract class A {
  protected abstract int isRunning();

  public void concreteMethod() {
    synchroinzed(isRunning()) {
       //do stuff
    }
  }
}

class B extends A {
  int running_ = 0;

  public int isRunning() {
     return running_;
  }
}

我得到的问题: int 不是同步语句的有效类型参数。我该怎么做呢?

4

6 回答 6

3

如果你想防止同时执行你的 block 和 method isRunning(),你不能完全按照你的意愿去做,因为synchronization不能被继承(只有一个实现可以证明synchronization)。

这是您可以做的最近的事情:

class A {
  protected Object lock = new Object();
  protected abstract int isRunning();
  public void concreteMethod() {
    synchronized(lock) {
       //do stuff
    }
  }
}

class B extends A {
  int running_ = 0;    
  public int isRunning() {
    synchronized(lock) {
     return running_;
    }
  }
}

如果您有能力锁定整个concreteMethod()块而不仅仅是一个块,您可以使用简单的解决方案将synchronized关键字添加到concreteMethodand isRunning()

class A {
  protected abstract int isRunning();
  public synchronized void concreteMethod() {
       //do stuff
  }
}

class B extends A {
  int running_ = 0;    
  public synchronized int isRunning() {
     return running_;
  }
}
于 2012-10-22T14:27:46.287 回答
1

您不能锁定原始值(int在您的情况下,因为isRunning()返回 a int)。

尝试替换intInteger例如。

于 2012-10-22T14:29:23.187 回答
1

这是官方文档所说的

Another way to create synchronized code is with synchronized statements. Unlike synchronized methods, synchronized statements must specify the object that provides the intrinsic lock

这意味着,对于同步,您首先需要一个对象来锁定。由于int不是对象,因此您会收到错误。Integer对象不会给出此错误,但仅使用 an而Integer不是int不能保证正确性。

这是一个关于java并发的非常好的教程

http://tutorials.jenkov.com/java-concurrency/index.html

于 2012-10-22T14:34:05.097 回答
1

我认为您混淆了两个概念。同步块总是要求引用作为它的参数时间,但你传递的是 int (原始数据类型)作为它的参数。您可以尝试使用 'this' 关键字(代替 isRunning() 方法)作为同步块参数。您还需要将 A 类声明为抽象类。您的代码中也存在拼写错误。您还可以考虑 @dystroy 的解决方案。

于 2012-10-22T14:39:29.127 回答
0

我猜你正在寻找这个:

class A
{
  protected abstract int isRunning();

  public synchronized void concreteMethod()
  {
       //do stuff
  }
}

class B extends A
{
  int running_ = 0;

  public synchronized int isRunning()
  {
   return running_;
  }

}
于 2012-10-22T14:28:01.130 回答
0

- sychronized块伴随着一个需要获得Object其锁的执行线程访问该块的锁。

- intprimitive类型而不是对象。

-与超类的对象一起创建一个同步块很容易被其子类访问。

例如:

public void concreteMethod()
  {
    synchroinzed(A.class) // or synchroinzed(A.class)
    {
       //do stuff
    }
  }
于 2012-10-22T14:29:49.897 回答