2014-02-16 47 views
19

我在脑海中有一个问题,我读了类对象锁定的静态同步方法 和对象的当前实例上的同步方法锁定。那么对类对象锁定 的含义是什么?在java中使用静态同步方法有什么用途?

任何人都可以请帮我关于这个话题?

+0

任何“同步”的方法或块上的条目,使得仅一次一个线程可以执行该方法/块(相对于锁定对象)“锁定”。此外,一次只能有一个线程执行*锁定在同一个对象上的任何*方法/块。一个静态同步方法被锁定在Class对象上。 –

+0

@Zavior我不认为它是重复的 - 你所关联的问题是关于“它是如何完成的”,而这个问题是关于“为什么这样做”。 – dasblinkenlight

+1

@dasblinkenlight我认为你是对的 – Zavior

回答

41

通常,​​方法用于保护对同时访问的资源的访问。当同时访问的资源属于您的类的每个实例时,您使用​​实例方法;当资源属于所有实例时(即,当它位于static变量中)时,则使用synchronized static方法来访问它。

例如,您可以制作一个工厂方法,该工厂方法可以保存其生成的所有对象的“注册表”。这种注册的自然地点将是一个static集合。如果您的工厂在多个线程中使用,则需要使工厂方法​​(或在方法内部具有​​块)来保护对共享static集合的访问。

请注意,使用​​而没有特定的锁对象时,通常不是最安全的选择,因为当您构建要在其他人编写的代码中使用的库时。这是因为恶意代码可能会在您的对象或类上同步以阻止自己的方法执行。为了保护你的代码不受这个影响,创建一个私有的“锁定”对象,实例或静态对象,并在该对象上进行同步。

+0

谢谢,@dasblinkenlight为这样的用户回答,尤其是在您的图书馆中使用私人锁定对象的指导。 –

18

简而言之,static synchronized方法将锁定类而不是对象,并且它将锁定类,因为关键字static表示:“class instead of instance”。

关键字​​表示一次只有一个线程可以访问该方法。
static synchronized意味着:

只有一个可以同时访问类。

+0

另请参阅更多详细信息 - http://www.javatpoint.com/static-synchronization-example – amar

+0

最好的只有4行:) – roottraveller

31

在运行时,每个类都有一个Class对象的实例。这是由static synchronized方法锁定的对象。 (任何同步的方法或块必须锁定一些对象。)

如果需要(无论是否在静态方法中),还可以手动同步此对象。这两种方法的行为相同:

class Foo { 
    static synchronized void methodA() { 
     // ... 
    } 

    static void methodB() { 
     synchronized (Foo.class) { 
      // ... 
     } 
    } 
} 
+1

Hats off ...这个话题不是很清楚util我看过你的答案。即使是java doc也没有像你那样看起来像..... –

相关问题