当我们使用类实例调用静态方法/函数时会发生什么?

时间:2013-06-09 06:23:07

标签: java multithreading static synchronization

静态变量和方法属于类而不是它的实例(对象)。通常使用 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对象调用)?如果线程处理静态方法仍然获取 类级别锁定它如何在内部找出它必须采取的锁定?

2 个答案:

答案 0 :(得分:4)

<强>问题1 : 类实例总是具有类的信息,因此从实例调用静态方法是有效的,因为它将具有关于类的信息。 其他方式是不可能的,因为类不会有关于其实例的信息,因此您不能使用类名调用实例级方法。

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

<强>问题2 : 来到第二个问题,当一个线程进入静态块或方法时,jvm知道要采取哪个锁,即类级别。用户无法控制它。因此,实例方法将采用对象锁定,并且静态方法将在线程处理时采用类锁定,而不管如何进行调用。

答案 1 :(得分:0)

Q1:您可以使用以下链接

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

Q2:首先,第二种方法会显示一条警告,告知它应该声明为静态,否则该字段不应该是静态的。 他们怎么绝对拥有不同的锁;实例方法有对象锁,静态对象有类级锁