【问题标题】:Difference between synchronized(foo.class) vs synchronized(SomeClass.class) [duplicate]同步(foo.class)与同步(SomeClass.class)之间的区别[重复]
【发布时间】:2017-01-20 07:10:03
【问题描述】:

我正在研究多线程概念。

 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

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

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

【问题讨论】:

  • 它们之间没有任何区别。
  • 是的,有区别。它们不在同一个对象上同步,因此它们不是互斥的,这意味着一个线程可以执行synchronized(foo.class)块内的代码,而另一个线程可以同时执行synchronized(SomeClass.class)类内的代码, b>.
  • 我的发现。任何 AnyClass.class 或 AnyClass.getClass() 都将返回一个唯一/singleTon 的类对象。因此 synchronized(AnyClass.class) 将锁定该引用,因此只有一个线程可以访问该块。我们也可以使用 private static final Object lock = new Object();做一把锁。所以我们可以在同步块中使用 AnyClass.class。

标签: java multithreading


【解决方案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 也将被锁定)

希望对你有帮助!

【讨论】:

  • 嗨安第斯。我已经编辑了这个问题。实际上我的问题是 synchronized(foo.class) 和 synchronized(SomeClass.class) ,我什么时候应该对同步块使用同一个类,什么时候应该使用其他类。据我所知,同步块将执行类级别锁定,并且只有一个线程可以访问该块。那么我可以使用任何类来进行类级别锁定吗?
  • @Andreas_D 使用类引用作为锁有什么特别之处?如果我们使用private final Object lock1 = new Object();private final Object lock2 = new Object();,也会有同样的效果。不是吗?
  • 请仔细阅读我的回答。锁不是一个class,而是一个object。您不必使用类实例,private Object lock3 = new Object() 也会这样做。如果要锁定单个方法:为方法使用不同的锁。如果您想完全锁定一组方法:对多个方法使用一个锁。它只取决于你的用例,你想用代码解决的问题。
  • @Aslamanwer,也许你不明白一个类是一个对象。表达式SomeClass.class 返回一个对单例Java 对象的引用,该对象的类是java.lang.Class
  • 小心。请不要混淆概念。在 OOP 中,objectclass 的一个实例。但是这里我们讨论的是 Java:每个 Java 类型(基本类型除外)都有一个关联的 java.lang.Class 类型实例。 Singleton 仅在单个类加载器的范围内为真。如果必须处理更多的类加载器,那么单个 Java 类型可以由同一个 Java 虚拟机中的多个 Class 实例表示。
猜你喜欢
  • 2014-09-30
  • 2017-08-14
  • 1970-01-01
  • 2021-10-16
  • 2014-04-27
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
  • 2015-07-25
相关资源
最近更新 更多