【发布时间】: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