Java 同步(foo.class)与同步(SomeClass.class)之间的差异

Java 同步(foo.class)与同步(SomeClass.class)之间的差异,java,multithreading,Java,Multithreading,我正在学习多线程概念 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(){ synchro

我正在学习多线程概念

 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

如您所见,我正在
testMethod1()
中的Foo.class上使用
synchronized
, 和
testMethod2()
中的SomeClass.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
        }
    }
}
公共类Foo{
//同步方法的锁
私有类lock1=Foo.Class;
私有类lock2=SomeClass.Class;
公共void testMethod1(){
已同步(锁1){
//一次只能有一个线程访问此块
}
}
公共void testMethod2(){
已同步(锁2){
//一次只能有一个线程访问此块
}
}
}
我们有两个锁,两个方法都可以并行执行,但每个方法一次只能由一个线程执行

如果我们在两个方法上使用相同的锁,那么这些方法就不能再并行执行了(如果一个线程进入了方法1,那么方法2也会被锁定)


希望有帮助

他们之间没有任何区别。是的,有区别。它们不是在同一个对象上同步的,因此它们不是互斥的,这意味着一个线程可以在
synchronized(foo.class)
block内执行代码,而另一个线程可以同时在
synchronized(SomeClass.class)
class内执行代码。我的发现。任何AnyClass.class或AnyClass.getClass()都将返回一个唯一/单一的类对象。因此,synchronized(AnyClass.class)将锁定该引用,因此只有一个线程可以访问该块。我们还可以使用私有静态final Object lock=new Object();做一把锁。所以我们可以在synchronized block.Hi Andeas中使用AnyClass.class。我已经编辑了这个问题。实际上,我的任务是同步的(foo.class)和同步的(SomeClass.class),什么时候我应该将同一个类用于同步块,什么时候使用其他类。据我所知,同步块将执行类级锁定,并且只有一个线程可以访问该块。所以我可以使用任何类来执行类级锁定。@Andreas\D使用类引用作为锁定有什么特殊之处?如果我们使用
private final Object lock1=new Object()
私有最终对象锁2=新对象(),也将具有相同的效果。是吗?请仔细阅读我的答案。锁不是一个类,而是一个对象。您不必使用类实例,
private Object lock3=new Object()
也可以这样做。如果要锁定单个方法:请对这些方法使用不同的锁。如果您想同时锁定多组方法:对多个方法使用一个锁。它只取决于您的用例,取决于您想用代码解决的问题。@Aslamanwer,也许您不理解类是一个对象。表达式
SomeClass.class
返回对单例Java对象的引用,该对象的类是
Java.lang.class
。小心。请不要混淆概念。在OOP中,
对象
的实例。但是这里我们讨论Java:每个Java类型(除了基本类型)都有一个关联的
Java.lang.Class
类型实例
Singleton
仅在单个类加载器的范围内有效。如果您必须处理更多的类加载器,那么单个Java类型可以由同一Java虚拟机中的许多
Class
实例表示。