1

静态变量和方法属于类而不是它的实例(对象)。通常使用className.staticMethod()className.staticVariable访问它们,但我们也可以使用类实例访问或调用它们,例如classInstance.staticMethod()classInstance.staticVariable

我的第一个问题是

为什么首先允许通过类实例访问静态方法/函数?它有任何用例吗?

下一个问题如下。考虑下面的类

public class Counter{
private static int count = 0;

public static synchronized int getCount()
{
  return count;
}

public synchronized setCount(int count)
{
   this.count = count;
}

}

在多线程环境中,如果这些函数被调用如下

Counter myCounter = new Counter();
myCounter.setCount(10);
System.out.println(myCounter.getCount());

第二个问题是

这两个函数会有单独的锁还是相同的锁(考虑到它们都被 myCounter 对象调用)?如果线程处理静态方法仍然获取类级锁,它如何在内部确定它必须使用什么锁?

4

2 回答 2

4

问题1:一个类实例总是有一个类的信息,所以从实例调用一个静态方法是有效的,因为它会有关于类的信息。其他方式是不可能的,因为类不会有关于它的实例的信息,所以你不能使用类名调用实例级方法。

如果您尝试通过实例调用静态方法,则会收到警告,因为您应该避免它,因此您不会得到有效的案例,但是允许通过实例进行静态调用是合乎逻辑的。

Question2: Coming to 2nd question, moment a thread enters a static block or method, jvm knows which lock to take i.e class level. User has no control over it. So instance method will take object lock and static method will take class lock as thread works on it irrespective of how call is made.

于 2013-06-09T06:27:57.290 回答
0

Q1: you can reed the following link

http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html

Q2: First of all the second method will show up a warning that it should declared as static otherwise the field should not be static. How ever they Absolutely have different locks; Instance method have object lock and static object have class level lock

于 2013-06-09T06:49:23.640 回答