Java MultiThreading - синхронные блоки
Java Synchronized Block используется для маркировки метода или кодового блока, который синхронизирован. Блоки синхронизации Java используются, чтобы избежать конкуренции. Эта статья представляет следующий контент:
Синхронизированные ключевые слова Java (синхронизированный)
Синхронизированные блоки в Java отмечены синхронизированными. Блоки синхронизации синхронизируются на объекте в Java. Все блоки синхронизации, синхронизированные на объекте, могут быть введены только одним потоком и одновременно выполнять операции. Все остальные потоки, ожидающие входа в блок синхронизации, будут заблокированы до тех пор, пока потоки в блоке синхронизации не будут выполнены.
Есть четыре различных блока синхронизации:
Приведенные выше блоки синхронизации все синхронизированы на разных объектах. Какой блок синхронизации действительно необходим, зависит от конкретной ситуации.
Синхронизация метода экземпляра
Вот метод синхронизированного примера:
public Synchronized void add (int value) {this.count += value; }
Статический метод синхронизация
Статический метод синхронизация такой же, как метод синхронизации метода экземпляра, а также используется синхронизированное ключевое слово. Синхронизация статического метода Java выглядит следующим образом:
public static synchronized void add (int value) {count += value; }Точно так же синхронизированное ключевое слово здесь говорит Java, что этот метод синхронизирован.
Синхронизация статических методов относится к синхронизации на объекте класса, где находится метод. Поскольку класс может соответствовать только одному объекту класса в виртуальной машине Java, только один поток может выполнять методы статической синхронизации в одном классе.
Для методов статической синхронизации в разных классах поток может выполнять методы статической синхронизации в каждом классе без ожидания. Независимо от метода статической синхронизации в вызываемом классе, класс может выполняться только одним потоком одновременно.
Синхронные блоки в методах экземпляра
Иногда вам не нужно синхронизировать весь метод, а вместо этого синхронизировать часть метода. Java может синхронизировать часть метода.
Пример блока синхронизации в асинхронном методе Java показан ниже:
public void add (int value) {synchronized (this) {this.count += value; }}Примеры используют конструктор Java Synchronous Block, чтобы отметить кусок кода, который синхронизирован. Этот код такой же, как и метод синхронизации при выполнении.
Обратите внимание, что конструктор Java Synchronous Block заключает объект в скобки. В приведенном выше примере «этот» используется, то есть сам экземпляр, который вызывает метод добавления. Объекты, заключенные в скобки в конструкторе синхронизации, называются объектами монитора. Приведенный выше код использует синхронизацию объекта монитора, а метод синхронного экземпляра использует экземпляр самого метода вызова в качестве объекта монитора.
Только один поток может выполняться в методах Java, синхронизированных с одним и тем же объектом монитора за раз.
Следующие два примера синхронизируют объект экземпляра, который они вызывают, поэтому они эквивалентны в синхронизированном эффекте выполнения.
открытый класс myclass {public synchronized void log1 (строка msg1, string msg2) {log.writeln (msg1); log.writeln (msg2); } public void log2 (строка msg1, string msg2) {synchronized (this) {log.writeln (msg1); log.writeln (msg2); }}}В приведенном выше примере только один поток может быть выполнен в любом из двух блоков синхронизации за раз.
Если второй блок синхронизации не синхронизирован на этом объекте экземпляра, два метода могут выполняться одновременно по потоку.
Синхронные блоки в статических методах
Аналогично вышеупомянутым, следующие примеры синхронизации двух статических методов. Эти методы синхронизируются на объекте класса, к которому принадлежит метод.
открытый класс myclass {public static synchronized void log1 (строка msg1, string msg2) {log.writeln (msg1); log.writeln (msg2); } public static void log2 (строка msg1, string msg2) {synchronized (myclass.class) {log.writeln (msg1); log.writeln (msg2); }}}Эти два метода не позволяют одновременно доступ по потокам.
Если второй блок синхронизации не синхронизируется на объекте MyClass.class. Тогда эти два метода можно получить с помощью потоков одновременно.
Экземпляр синхронизации Java
В следующем примере запускаются два потока, оба вызывают метод добавления одного и того же экземпляра класса счетчиков. Поскольку синхронизация находится на экземпляре, к которому принадлежит метод, только один поток может одновременно получить доступ к методу.
счетчик открытого класса {long count = 0; public Synchronized void add (длинное значение) {this.count += value; }} public Class Counterhread extends Thread {Защищенный счетчик счетчика = null; public Counterhread (счетчик) {this.count = counter; } public void run () {for (int i = 0; i <10; i ++) {counter.add (i); }}} public class example {public static void main (string [] args) {counter counter = new counter (); Thread Threada = new Counthread (счетчик); Thread Thinkb = new Counthread (счетчик); threada.start (); ThintB.Start (); }}Было создано две темы. Их конструктор относится к одному счетчику. Метод counter.add синхронизируется на экземпляре, потому что метод добавления является методом экземпляра и помечен синхронизированным ключевым словом. Следовательно, только один поток может вызывать метод за раз. Другой поток должен подождать, пока первый поток не выведет метод add (), прежде чем продолжить выполнять метод.
Если два потока относятся к двум различным экземплярам счетчика, они могут одновременно вызвать метод add (). Эти методы вызывают разные объекты, поэтому эти методы синхронизируются на разных объектах. Эти вызовы метода не будут заблокированы. Как показано в следующем примере:
Пример открытого класса {public static void main (string [] args) {counter countera = new counter (); Counter counterb = new Counter (); Thread Threada = new Counthread (Countera); Thread Thinkb = new Counthread (Counterb); threada.start (); ThintB.Start (); }}Обратите внимание, что эти два потока, Threada и Threadb, больше не относятся к одному и тому же экземпляру счетчика. Методы Add Countera и Counterb синхронизируются на объекте, к которому они принадлежат. Метод вызова Countra «Добавить» не будет блокировать вызов для метода добавления counterb.
Вышесказанное-это объяснение знаний о многопоточных блоках синхронизации Java. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за поддержку этого сайта!