【发布时间】:2010-12-11 06:06:25
【问题描述】:
我创建了两个线程并使用了一个类的实例,称为该对象的静态和非静态方法。理想情况下,静态方法需要使用类名来调用,我也这样做了。
我在线程调用其方法的类的私有静态成员上同步了静态和非静态方法。我注意到输出是同步的!
我的问题是:
静态方法如果使用同步块进行同步,它通常需要类实例,那么它是如何接受静态对象的!
当调用静态方法的线程获取类级锁而调用非静态方法的线程获取对象级锁时,输出是如何同步的!
即使我在基于对象的静态和非静态方法中都使用了同步块,它确实不应该同步;还是静态对象上的同步块的特殊情况?
请告诉我。
以下是我写的代码:
public class StaticNonStaticSynch
{
public static void main(String[] args)
{
final StaticNonStaticTest staticNonStaticTest = new StaticNonStaticTest();
Runnable runnable1 = new Runnable()
{
@Override
public void run()
{
staticNonStaticTest.nonStaticMethod();
}
};
Runnable runnable2 = new Runnable()
{
@Override
public void run()
{
staticNonStaticTest.staticMethod();
}
};
Thread thread1 = new Thread(runnable1, "First Thread");
Thread thread2 = new Thread(runnable2, "Second Thread");
thread1.start();
thread2.start();
}
}
class StaticNonStaticTest
{
private static Object object = new Object();
void nonStaticMethod()
{
synchronized (object)
{
for(int i=0;i<500;i++)
{
System.out.println("Non - Static method called by " + Thread.currentThread().getName() +" : = "+i);
}
}
}
static void staticMethod()
{
synchronized (object)
{
for(int i=0;i<500;i++)
{
System.out.println("Static method called by " + Thread.currentThread().getName() +" : = "+i);
}
}
}
}
【问题讨论】:
-
请正确编辑文本。对代码 sn-p 使用 101010 图标。
-
“调用非静态方法的线程获取对象级锁” 他们不获取对象级锁。实例方法获取类级锁。
标签: java multithreading static synchronization