synchronized(foo.class)与synchronized(SomeClass.class)之间的区别

时间:2017-01-20 07:10:03

标签: 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(){

      synchronized(SomeClass.class){

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

      }
    }

}

我将在我的代码中使用testMethod1或testMethod2。

如您所见,我在synchronized Foo.class 上使用testMethod1(), 和testMethod2()中的 SomeClass.class

如果我使用它的任何方法在多线程访问中给出相同的结果。 我想知道用法之间的区别,当我必须为同步块使用相同的类和其他类用于同步块时。

或者上述两种方法有什么区别?

1 个答案:

答案 0 :(得分: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也会被锁定)

希望它有所帮助!