synchronized static方法vs synchronized类对象

时间:2013-08-05 16:47:40

标签: java static synchronize

假设我的Foo课程看起来像这样

public class Foo
{
    public static void func_1() { /* do something */ }
    public static void func_2() { /* do something */ }
}

我的Bar课程看起来像这样

public class Bar
{
    public void method_1()
    {
         synchronized(Foo.class)
         {
             Foo.func_1();
         } 
    }          
}

现在我可以将Foo.classBar.method_1声明为Foo.func_1,而不是在Foo.func_2中锁定synchronized对象,而且仍然存档的目的相同吗? / p>

谢谢

3 个答案:

答案 0 :(得分:3)

静态同步方法获取类上的锁定并通过锁定Foo.class,你正在做同样的事情。所以是的,他们会实现同样的目标。

答案 1 :(得分:2)

是的,他们实现了同样的目标 - 锁定Foo.class。以下是Java Language Specification, Section 8.4.3.6的相关摘录:

  

对于类(静态)方法,与类关联的监视器   使用方法类的对象。

synchronized类中的静态func_1()func_2()方法上使用Foo会隐式隐藏Foo.class,而synchronized(Foo.class)会明确锁定它

答案 2 :(得分:0)

是的,他们几乎是一样的。唯一的区别是:在一种情况下,在调用方法之前获取锁定,而在另一种情况下,在稍后获取锁定。