Самым основным методом синхронизации Java является использование синхронизированного ключевого слова для управления параллельным доступом метода. Каждый метод, объявленный с помощью синхронизированного ключевого слова, является критическим разделом. В Java только один из критических разделов одного и того же объекта разрешается одновременно получить доступ.
Статические методы имеют разные поведения. Статический метод, объявленный с помощью синхронизированного ключевого слова, можно получить только одним поток выполнения, но другие потоки могут получить доступ к нестатическому синхронизированному методу этого объекта. Это должно быть очень осторожным, потому что два нити могут получить доступ к двум различным синхронизированным методам объекта одновременно, то есть одним из которых является статический синхронизированный метод, а другой-нестатический метод синхронизированного. Если оба метода изменят одинаковые данные, возникнет несовместимая ошибка.
Синтаксис синхронизированного блока заключается в следующем:
public void method () {synchronized (Expression) {}} Есть два использования синхронизированного ключевого слова. Один используется только в определении методов, а другой - синхронизированный блок. Мы можем не только использовать синхронизированный для синхронизации переменной объекта, но и вы можете использовать SynchronizedL для синхронизации статических методов и нестатических методов в классе.
Первый: синхронизация нестатических методов
Из синтаксиса, связанного с Java, мы можем знать, что использование синхронизированного ключевого слова для определения метода будет блокировать статические методы и нестатические методы, определяемые ключевым словом Synchroniezd в классе, но это немного сложно понять. Если вы хотите синхронизировать блоки для достижения такого эффекта, нетрудно понять, почему этот эффект производится. Если вы используете синхронизированный для блокировки всех синхронизированных нестатических методов в классе, вам нужно только использовать это в качестве параметра синхронизированного блока для передачи в синхронизированный блок. Код заключается в следующем:
Общедоступный тест класса {public void method1 () {synchronized (this) {}} public synchronized void method2 () {}} public class test {public void method1 () {synchronized (this) {}} public synchronized void method2 () {}} В приведенном выше коде Method1 использует синхронизированный блок, а метод Method2 использует ключевое слово синхронизированного для определения метода. Если вы используете один и тот же тестовый экземпляр, до тех пор, пока выполняется один из этих двух методов, другие методы будут заблокированы, поскольку они не получили блокировку синхронизации. В дополнение к использованию этого в качестве параметра синхронизированного блока, вы также можете использовать тест. Этот параметр синхронизированного блока для достижения того же эффекта.
Используя синхронизированные блоки во внутренних классах, это представляет только внутренние классы и не имеет ничего общего с внешними классами (OUTERCLASS). Однако нестатические методы во внутренних классах и нестатических методах во внешних классах также могут быть синхронизированы. Если вы добавите метод метода3 во внутренний класс, вы также можете синхронизировать с двумя методами тестирования, код выглядит следующим образом:
Общедоступный тест класса {class innerclass {public void method3 () {synchronized (test.this) {}}} public class test {class innerclass {public void method3 () {synchronized (test.this) {}}}}}}}}} Метод 3 Метода внутреннего класса выше и методы Method1 и Method2 тестирования может иметь только один метод, выполненный одновременно.
Правильно ли синхронизированный блок выполняется или синхронизированный блок выходит из -за исключения из -за ошибки программы, блокировка синхронизации, удерживаемое текущим синхронизированным блоком, будет автоматически выпущена. Поэтому вам не нужно беспокоиться о блокировке синхронизации при использовании синхронизированного блока.
2. Синхронизация статических методов
Поскольку экземпляры объектов не обязательно создаются при вызове статических методов, это не может быть использовано для синхронизации статических методов, но должно использовать объекты класса для синхронизации статических методов. Код заключается в следующем:
Общедоступный тест класса {public static void method1 () {synchronized (test.class) {}} public static synchronized void method2 () {}} public class test {public static void method1 () {synchronized (test.class) {}} public static synchronized void method2 () {}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}При синхронизации статических методов вы можете использовать класс статического поля класса для получения объекта класса. В приведенном выше примере существует только один метод выполнения методов Method1 и Method2. В дополнение к использованию поля класса, вы также можете получить объект класса через метод getClass () экземпляра. Код заключается в следующем:
Общедоступный тест класса {Общедоступный статический тест; public test () {test = this; } public static void method1 () {synchronized (test.getClass ()) {}} public Class Test {public Static Test Test; public test () {test = this; } public static void method1 () {synchronized (test.getClass ()) {}}}
В приведенном выше коде мы получаем экземпляр тестирования через общедоступный статический объект и получаем объект класса с помощью метода GetClass этого экземпляра (обратите внимание, что все экземпляры класса получаются с помощью метода GetClass). Мы также можем синхронизировать статические методы различных классов через класс, код заключается в следующем:
Общедоступный Test1 {public static void method1 () {synchronized (test.class) {}}} public class test1 {public static void method1 () {synchronized (test.class) {}}}
ПРИМЕЧАНИЕ. Когда синхронизированные блоки используются для синхронизации методов, нестатические методы могут быть синхронизированы через это, в то время как статические методы должны синхронизировать с использованием объектов класса, но нестатические методы также могут быть синхронизированы с использованием класса. Однако это не может быть использовано в статических методах для синхронизации нестатических методов. На это нужно обратить внимание при использовании синхронизированных блоков.
Примечание
Синхронизированное ключевое слово ухудшит производительность приложения, и, следовательно, его можно использовать только для методов, которые требуют изменения общих данных в одновременных сценариях. Если несколько потоков получают доступ к одному и тому же синхронизированному методу, только один поток может получить к нему доступ, а другие потоки будут ждать. Если в объявлении метода не используется синхронизированное ключевое слово, все потоки могут выполнять метод одновременно, тем самым сокращая общее время выполнения. Если вы, как известно, называют более чем одним потоком, вам не нужно объявлять его, используя синхронизированное ключевое слово.
Методы, объявленные синхронизированными, можно назвать рекурсивно. Когда поток обращается к методу синхронизации объекта, он также может вызвать другие методы синхронизации объекта, включая метод выполнения, без необходимости снова получить доступ к методу.
Мы можем защитить доступ к кодовым блокам (а не всему методу) через синхронизированное ключевое слово. Синхронизированное ключевое слово следует использовать так: остальная часть метода остается вне синхронизированного кодового блока для лучшей производительности. Доступ к критическому разделу (то есть блоки кода, к которым можно получить только один поток одновременно), должен быть как можно более коротким. Например, при работе с получением количества людей в здании мы используем только синхронизированное ключевое слово для защиты инструкций по обновлению количества людей, и делаем другие операции не использовать общие данные. При использовании синхронизированных ключевых слов таким образом ссылка на объект должна использоваться в качестве входящего параметра. Только один поток разрешен для доступа к этому синхронизированному коду одновременно. Вообще говоря, мы используем это ключевое слово для обозначения объекта, к которому принадлежит выполняемый метод:
синхронизированный (это) {// java -код}