Объект и экземпляр - это одно и то же? - PullRequest
0 голосов
/ 01 июля 2018

Читая о синхронизации, я прочитал статический синхронизированный метод, заблокированный на объекте класса, и синхронизированный метод блокируется на текущем экземпляре объекта. У меня путаница, что такое объект класса и экземпляр объекта? Разве объект и экземпляр не одно и то же?

Ответы [ 3 ]

0 голосов
/ 01 июля 2018

Для каждого класса, загруженного в JVM, будет создан экземпляр класса Class. Например: Студент студент = новый студент ()

когда указанная строка кода исполняемого класса (Student) загружается в JVM первой bcz JVM необходим шаблон для создания объекта. И на основе шаблона JVM создает экземпляр Student в куче. Вместе с экземпляром Student JVM создает экземпляр класса Class в куче В этом экземпляре класса вся информация о STudent, такая как количество конструкторов, методов, переменных и т. Д., Мы используем для отражения.

Теперь все созданные экземпляры (объекты) будут иметь связанную с ними блокировку, которая проявляется при выполнении синхронизированных методов или блоков (которые могут быть статическими или экземплярами). если вы выполняете какие-либо статические методы в синхронизированном контексте, тогда блокировка класса Class (из STudent) будет получена до ее завершения.

0 голосов
/ 01 июля 2018

Я думаю, что бы вы ни читали это, можно было бы сформулировать это лучше.

Разница между синхронизированными методами экземпляра и синхронизированными статическими методами заключается в том, что последний «блокирует» класс, тогда как первый блокирует экземпляр того класса, для которого вызывается синхронизированный метод. См. ответ для получения дополнительной информации.

Предполагая, что автор знает, о чем он / она говорит, слово «объект класса» создает путаницу, поскольку сами классы не являются объектами. Он / она говорит о случаях Class<T>? Возможно нет. Автор должен был просто сказать «класс».

Что касается различия между «объектом» и «экземпляром» вне контекста синхронизации, они означают действительно одно и то же - те вещи, которые вы создаете, вызывая конструкторы (и строковые литералы).

Лично я считаю, что слово «объект» имеет более высокий уровень абстракции. Когда я говорю на низком уровне абстракции (речь идет об отдельных строках кода, например, «я создал здесь экземпляр Foo, написав new Foo()»), я бы использовал «экземпляр». Когда я говорю о вещах на более высоком уровне (например, как работает вся система), я склонен использовать «объект». Но это может быть только я. Другие люди могут использовать их взаимозаменяемо.

0 голосов
/ 01 июля 2018

Действующим словом здесь является класс . У каждого класса есть экземпляр java.lang.Class, который представляет его в текущем загрузчике классов.

Рассмотрим этот простой пример:

public class MyClass {
    public synchronized void instanceMethod() {
        // This method will synchronize on the instance of MyClass that called it
    }

    public static synchronized void staticMethod() {
        // This method will synchronize on  MyClass.class
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...