0

Мое понимание заключается в том, что для синхронизации в ClassName.class говорят, что Penguin.class может быть не всегда правильным (я имею в виду использование Penguin.class как обычной внутренней блокировки, если это не преднамеренно для статического доступа Penguin.class), а вместо этого предпочтительный способ синхронизации был бы на пингвине (экземпляр Penguin.class). Если я использую прежний подход, я вижу блокирование всех статических методов Penguin на некоторое время (так что если это не следует предугадать, то этого следует избегать).
Будет ли прежний подход также блокировать чтение и запись в статические поля (не думайте)? Есть ли другие побочные эффекты, которые мне не хватает? Производительность и т.д.В java возможны побочные эффекты синхронизации на ClassName.class вместо экземпляра класса?

+0

Синхронизация на 'Class' экземпляр блокирует другой код, который синхронизирует на тот же экземпляр класса.Ничего больше, ничем не отличается от синхронизации на любом другом экземпляре. –

+5

Вы думаете о слишком низком уровне. Многопоточный код трудно писать, даже для умных людей. Вам лучше использовать новый пакет параллелизма и думать о неизменных данных. Более функциональный подход будет гораздо более безопасным и понятным. Предотвращение изменения нитей в изменяемых статических полях вызывает проблемы. Я бы передумал. – duffymo

+0

@duffymo - я не могу решить, язык для этого приложения, это уже сделано, но никогда не пыль. какая-то другая вещь ломается. Не сделали много FP, но поддерживает ли он многопоточность в целом и поддерживает ли scala ее поддержку. – samshers

ответ

0

Будет ли прежний подход также блокировать чтение и запись в статические поля (подумайте не)?

Синхронизация никогда блоки читает или пишет любое поле (статический или иным образом). Единственное, что блокирует синхронизация, это блокирует другие потоки от синхронизации на одном и том же объекте одновременно.

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

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

Итак, что синхронизировать?

Ну, сколько из этих структур данных есть в вашей программе? Если есть только один из них, то у вас должен быть только один объект синхронизации. Foobar.class - это объект, который, как правило, будет только одним из ваших программ, поэтому синхронизация на объекте Class часто является хорошим выбором при защите глобальных данных.

Если существует много подобных структур, то для каждого из них часто имеет смысл иметь собственный независимый объект блокировки. Таким образом, два потока могут работать на двух разных экземплярах одновременно, и они только блокируют друг друга, если они пытаются работать на одном экземпляре.

Если ваши структуры представлены экземпляром класса Foobar, то самым простым способом это синхронизация на экземпляре foobar. Более сложный способ сделать это для каждого Foobar объекта, чтобы иметь свой собственный объект private блокировки:

class Foobar { 
    private final Object lock = new Object(); 

    ... 

    public SomeType someOperation(...) { 
     ... 
     synchronized(lock) { 
      doSomethingThatNeedsProtection(); 
     } 
     ... 
    } 
} 
+0

Синхронизация на Foobar.class блокирует все статические методы в Foobar.class. Правильно?? – samshers

+0

@samshers, Нет. Он не будет блокировать какие-либо методы. Единственное, что синхронизирует все блоки, - блокирует другие потоки от синхронизации на одном и том же объекте или классе одновременно. (Примечание. Когда вы пишете синхронизированный _method_, это всего лишь сокращенный способ написания метода, тело которого является синхронизированным _statement_. Http://stackoverflow.com/questions/25642642/static-synchronized-method-provides-class-level- lock-what-do-class-level-lock/25644342 # 25644342) –

+0

как насчет взаимного исключения. ... я пропустил добавление * синхронизированный * то есть статические синхронизированные методы, тогда я надеюсь, что эти методы будут заблокированы. Правильно?? – samshers

0

Класс, по существу, является объектом, в котором есть только один во время выполнения.

класса Т является объект (экземпляр) класса

класса блокировка на уровне предотвратит несколько потоков, поступающих в синхронизированный блок, где он используется, и поэтому подобное, где замок на «объект».