2017-01-20 54 views
-1

我正在通過多線程的概念。同步(foo.class)vs同步(SomeClass.class)之間的區別

public class Foo{ 

    public void testMethod1(){ 

     synchronized(foo.class){ 

     // only one thread can access this block at a time 
     } 

    } 

    // or i can use the below method 

    public void testMethod2(){ 

     synchronized(SomeClass.class){ 

     // only one thread can access this block at a time 

     } 
    } 

} 

我將在我的代碼中使用testMethod1或testMethod2。

正如你可以看到我在testMethod2()使用​​在讓Foo.classtestMethod1(), 和SomeClass.class

如果我使用的任何方法在多線程訪問中給出相同的結果。 我想知道用法之間的區別,當我必須使用相同的類同步塊和一些其他類同步塊。

或者上述兩種方法有什麼不同?

+1

它們之間沒有任何區別。 –

+2

是的,有區別。它們不在同一個對象上同步,所以它們不是互斥的,這意味着一個線程可以在'synchronized(foo.class)'塊內執行代碼,而另一個線程可以在'synchronized(SomeClass.class)'類中執行代碼, **與此同時**。 – Andreas

+1

我的發現。任何AnyClass.class或AnyClass.getClass()都會返回一個unique/singleTon類對象。因此,同步的(AnyClass.class)將鎖定該引用,因此只有一個線程可以訪問該塊。另外我們可以使用private static final Object lock = new Object();鎖定。所以我們可以在同步塊中使用AnyClass.class。 –

回答

1

我們在對象上進行同步,而不是在類上進行同步。這就是你所做的:你在Class的兩個不同實例上同步。如果我們重寫了一下,變得更清晰:

public class Foo { 

    // the locks for the synchronized methods 
    private Class<Foo> lock1 = Foo.class; 
    private Class<SomeClass> lock2 = SomeClass.class; 

    public void testMethod1() { 
     synchronized (lock1) { 
      // only one thread can access this block at a time 
     } 
    } 

    public void testMethod2() { 
     synchronized (lock2) { 
      // only one thread can access this block at a time 
     } 
    } 
} 

我們有兩個鎖,這兩種方法可以並行,但每種方法僅通過一次一個線程執行。

如果我們將使用兩個方法相同的鎖,那麼這些方法不能並行執行了(如果一個線程進入方法1,然後方法2將被太侷限於)

希望它可以幫助!

+0

嗨安第斯。我編輯了這個問題。其實我的問題同步(foo.class)和同步(SomeClass.class),我應該什麼時候使用同一類的同步塊和當其他一些類。因爲我知道同步塊會做類鎖定,只有一個線程可以訪問該塊。所以我可以使用任何課程來完成課程級別的鎖定。 –

+1

@Andreas_D使用類引用作爲鎖有什麼特別之處?如果我們使用'private final Object lock1 = new Object();'和'private final Object lock2 = new Object();',那也會有相同的效果。不是嗎? –

+0

請仔細閱讀我的答案。該鎖不是*類*,而是*對象*。你不必使用類實例,一個'private Object lock3 = new Object()'會做同樣的事情。如果你想鎖定單個方法:爲方法使用不同的鎖。如果你想完全鎖定一組方法:爲多個方法使用一個鎖。它只取決於你的用例,關於你想用代碼解決的問題。 –