我正在通過多線程的概念。同步(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.class在testMethod1()
, 和SomeClass.class。
如果我使用的任何方法在多線程訪問中給出相同的結果。 我想知道用法之間的區別,當我必須使用相同的類同步塊和一些其他類同步塊。
或者上述兩種方法有什麼不同?
它們之間沒有任何區別。 –
是的,有區別。它們不在同一個對象上同步,所以它們不是互斥的,這意味着一個線程可以在'synchronized(foo.class)'塊內執行代碼,而另一個線程可以在'synchronized(SomeClass.class)'類中執行代碼, **與此同時**。 – Andreas
我的發現。任何AnyClass.class或AnyClass.getClass()都會返回一個unique/singleTon類對象。因此,同步的(AnyClass.class)將鎖定該引用,因此只有一個線程可以訪問該塊。另外我們可以使用private static final Object lock = new Object();鎖定。所以我們可以在同步塊中使用AnyClass.class。 –