【问题标题】:What happens when we call a static method/function using class instance?当我们使用类实例调用静态方法/函数时会发生什么?
【发布时间】:2013-06-09 06:23:07
【问题描述】:

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

【问题讨论】:

  • 他们使用不同的锁。实例方法拥有实例对象的锁(myCounter的锁),静态方法拥有类实例的锁(Counter.class的锁)。

标签: java multithreading static synchronization


【解决方案1】:

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

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

问题2: 谈到第二个问题,当一个线程进入一个静态块或方法时,jvm 知道要使用哪个锁,即类级别。用户无法控制它。因此,实例方法将采用对象锁,而静态方法将采用类锁,因为线程对其进行操作,而不管调用方式如何。

【讨论】:

    【解决方案2】:

    Q1:您可以点击以下链接

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2013-07-29
      • 2012-06-06
      • 1970-01-01
      相关资源
      最近更新 更多