Статический синхронизированный метод обеспечивает блокировку уровня класса. Что означает блокировка уровня класса?

1

Означает ли это, что любой Thread независимо от объекта, который он получает, не будет мешать другим Thread, выполняющемуся в Synchronized static method. Даже если мы вызываем с class_name.static_Method.

Ex- If we have two thread :

public class Test implements Runnable {

  public synchronized static testMethod(){}

  public void run(){ testMethod(); }

  public static void main(String[] args) {
   Test obj1=new Test();
   Test obj2=new Test();
   Thread t1=new Thread(obj1);
   Thread t2=new Thread(obj2);
   t1.start(); // thread on object obj1
   t2.start(); // Thread on object obj2
   Test.testMethod(); // main thread
}
}

Если Thread t1 входит в статический метод, тогда t2 и основной поток не будут вводить метод, даже если оба имеют разные объекты. Исправьте меня, если я ошибаюсь.

Теги:
multithreading
static
locking

3 ответа

0
Лучший ответ

Если Thread t1 входит в статический метод, тогда t2 и основной поток не будут вводить метод, хотя оба имеют разные объекты

его static метод, который является методом класса (общего) для всех экземпляров (объектов) этого класса, следовательно, объекты не имеют значения. Если он объявлен как synchronized, то Thread, который будет выполнять этот метод, получит блокировку объекта класса (объект Class<Test>),

static synchronized метод можно рассматривать как ниже

public static testMethod(){
   synchronized(Test.class) {
      //method body
   }
}

Поскольку класс загружается один раз (если вы не определяете свой пользовательский загрузчик классов и повторно загружаете класс), будет существовать только один объект класса, который действует как блокировка для взаимного исключения

  • 0
    Означает ли это, что если поток t1 входит в статический синхронизированный блок, то t1 получит две блокировки, одну для объекта obj1 и вторую для объекта класса.
  • 0
    Что означает Class.class? Можем ли мы написать это вместо Test.class.
Показать ещё 2 комментария
1

Ты думаешь об этом, все неправильно. Не пишите это:

public class Test implements Runnable {
    static synchronized SomeType testMethod() { ... }
    ...
}

Напишите это вместо этого. Это означает точно то же самое, но оно показывает, что происходит:

public class Test implements Runnable {
    static SomeType testMethod() { synchronized(Test.class) {...} }
    ...
}

Затем все, что вам нужно знать, это то, что Test.class - это уникальный объект (объект, который содержит описание вашего тестового класса), и, конечно же, ни один из двух потоков не может синхронизироваться на одном и том же объекте одновременно.

То же самое касается синхронных методов экземпляра:

public class Test implements Runnable {
    synchronized SomeType testMethod() { ... }
    ...
}

Означает то же, что и

public class Test implements Runnable {
    SomeType testMethod() { synchronized(this) {...} }
    ...
}

Но второй показывает, что происходит на самом деле.

0

T1 и T2 синхронизируются в Object Test.class. Помните, что классы - это объекты типа java.lang.Class

  • 0
    Что означает Class.class? Можем ли мы написать это вместо Test.class
  • 0
    Class.class означает Объект класса java.lang.Class. Почему вы хотите синхронизировать его?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню