Ключевое слово синхронизировано имеет два применения. Первый — использовать его непосредственно в определении метода, как описано в статье «Использование ключевого слова Synchronized для синхронизации методов класса». Другой тип — синхронизированный блок. Мы можем не только синхронизировать объектную переменную через синхронизированные блоки. Вы также можете использовать синхронизированные блоки для синхронизации статических и нестатических методов в классе.
Синтаксис синхронизированного блока следующий:
Скопируйте код кода следующим образом:
публичный недействительный метод()
{
… …
синхронизировано(выражение)
{
… …
}
}
1. Синхронизация нестатических методов класса
Из статьи «Использование ключевого слова Synchronized для синхронизации методов класса» мы знаем, что использование ключевого слова Synchronized для определения методов заблокирует все статические или нестатические методы, определенные с использованием ключевого слова synchronzied в классе, но это непросто понять. Если вы используете синхронизированные блоки для достижения того же эффекта, нетрудно понять, почему возникает этот эффект. Если вы хотите использовать синхронизированный блок для блокировки всех синхронизированных нестатических методов в классе, вам необходимо использовать его как параметр синхронизированного блока и передать его в страну синхронизированного блока. Код выглядит следующим образом:
Синхронизируйте нестатические методы через синхронизированные блоки.
Скопируйте код кода следующим образом:
общедоступный класс SyncBlock
{
публичный недействительный метод1()
{
Synchronized(this) // Эквивалентно использованию ключевого слова Synchronized в методе Method1.
{
… …
}
}
публичный недействительный метод2()
{
синхронизировано(это) // Эквивалентно использованию ключевого слова синхронизировано для метода метода2
{
… …
}
}
публичный синхронизированный метод void3()
{
… …
}
}
В приведенном выше коде синхронизированные блоки используются в методах метода1 и метода2. Метод метод3 в строке 017 по-прежнему использует ключевое слово Synchronized для определения метода. При использовании одного и того же экземпляра класса SyncBlock, пока выполняется один из трех методов, два других метода будут заблокированы, поскольку блокировка синхронизации не получена. Чтобы добиться того же эффекта, что и ключевое слово Synchronized, при использовании синхронизированного блока весь код должен быть записан в синхронизированном блоке. В противном случае весь код в текущем методе не будет синхронизирован с другими методами.
Помимо использования this в качестве параметра синхронизированного блока, вы также можете использовать SyncBlock.this в качестве параметра синхронизированного блока для достижения того же эффекта.
При использовании синхронизированного блока в методе внутреннего класса (InnerClass) он представляет только внутренний класс и не имеет ничего общего с внешним классом (OuterClass). Но нестатические методы внутреннего класса можно синхронизировать с нестатическими методами внешнего класса. Например, добавьте метод Method4 во внутренний класс InnerClass и синхронизируйте метод Method4 с тремя методами SyncBlock. Код выглядит следующим образом:
Синхронизировать нестатические методы внутреннего класса с нестатическими методами внешнего класса.
Скопируйте код кода следующим образом:
общедоступный класс SyncBlock
{
… …
классИннерКласс
{
публичный недействительный метод4()
{
синхронизировано(SyncBlock.this)
{
… …
}
}
}
… …
}
В новой версии класса SyncBlock, указанной выше, метод метода 4 класса InnerClass синхронизирован с тремя другими методами класса SyncBlock. Таким образом, только один метод из четырех методов: метод1, метод2, метод3 и метод4 может быть выполнен. в то же время.
Независимо от того, выполняется ли синхронизированный блок нормально или происходит ненормальный выход из синхронизированного блока из-за ошибки программы, блокировка синхронизации, удерживаемая текущим синхронизированным блоком, будет автоматически снята. Поэтому вам не нужно беспокоиться о снятии блокировок синхронизации при использовании синхронизированных блоков.
2. Синхронизация методов статического класса
Потому что при вызове статического метода экземпляр объекта не обязательно создается. Следовательно, вы не можете использовать это для синхронизации статических методов, но вы должны использовать объекты класса для синхронизации статических методов. Код выглядит следующим образом:
Синхронизируйте статические методы через синхронизированные блоки.
Скопируйте код кода следующим образом:
открытый класс StaticSyncBlock
{
публичный статический метод void1()
{
синхронизировано (StaticSyncBlock.class)
{
… …
}
}
общедоступный статический синхронизированный метод void2()
{
… …
}
}
При синхронизации статических методов вы можете использовать класс статического поля класса для получения объекта класса. В приведенном выше примере одновременно может выполняться только один метод метода1 и метода2. Помимо использования поля класса для получения объекта Class, вы также можете использовать метод экземпляра getClass для получения объекта Class. Код в приведенном выше примере можно изменить следующим образом:
Используйте метод getClass для получения объекта класса.
Скопируйте код кода следующим образом:
открытый класс StaticSyncBlock
{
общедоступный статический экземпляр StaticSyncBlock;
публичный Статиксинкблок()
{
экземпляр = это;
}
публичный статический метод void1()
{
синхронизировано(instance.getClass())
{
}
}
}
В приведенном выше коде экземпляр класса StaticSyncBlock получается через общедоступный статический экземпляр, а объект Class получается с помощью метода getClass этого экземпляра (все экземпляры класса получают один и тот же объект Class с помощью метода getClass, поэтому можно использовать любой метод экземпляра getClass). Мы также можем синхронизировать статические методы разных классов через объекты Class, такие как метод статического метода класса Test и два статических метода класса StaticSyncBlock. Код выглядит следующим образом:
Метод метода класса Test синхронизируется с методами метод1 и метод2 класса StaticSyncBlock.
Скопируйте код кода следующим образом:
тест публичного класса
{
публичный статический метод void()
{
синхронизировано (StaticSyncBlock.class)
{
}
}
}
Примечание. При использовании методов класса синхронизации синхронизированных блоков нестатические методы могут использовать это для синхронизации, тогда как статические методы должны использовать объект класса для синхронизации. Они не влияют друг на друга. Конечно, вы также можете использовать объекты класса в нестатических методах для синхронизации статических методов. Но это нельзя использовать в статических методах для синхронизации нестатических методов. Это следует учитывать при использовании методов класса синхронизации блоков.