静态变量和方法属于类而不是它的实例(对象)。通常使用 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对象调用)?如果线程处理静态方法仍然获取 类级别锁定它如何在内部找出它必须采取的锁定?
答案 0 :(得分:4)
<强>问题1 强>: 类实例总是具有类的信息,因此从实例调用静态方法是有效的,因为它将具有关于类的信息。 其他方式是不可能的,因为类不会有关于其实例的信息,因此您不能使用类名调用实例级方法。
如果你试图通过实例调用一个静态方法,你会收到警告,因为你应该避免它,所以你不会得到一个有效的案例,但是它是合乎逻辑的,允许通过实例进行静态调用。
<强>问题2 强>: 来到第二个问题,当一个线程进入静态块或方法时,jvm知道要采取哪个锁,即类级别。用户无法控制它。因此,实例方法将采用对象锁定,并且静态方法将在线程处理时采用类锁定,而不管如何进行调用。
答案 1 :(得分:0)
Q1:您可以使用以下链接
http://docs.oracle.com/javase/tutorial/java/javaOO/classvars.html
Q2:首先,第二种方法会显示一条警告,告知它应该声明为静态,否则该字段不应该是静态的。 他们怎么绝对拥有不同的锁;实例方法有对象锁,静态对象有类级锁