Синхронизированное ключевое слово представляет, что этот метод заблокирован. Он эквивалентен независимо от того, какой поток (например, поток A), при запуске этого метода вы должны проверить, используют ли другие потоки B (или C, D и т. Д.). Если это так, дождитесь потока B (или C, D), который использует синхронизированный метод для запуска этого метода перед запуском этого метода. Если нет, заблокируйте вызывающего абонента и запустите его напрямую. Он включает в себя два использования: синхронизированный метод и синхронизированный блок.
Механизм многопоточного синхронизации блокирует ресурсы, так что в то же время может работать только один поток, а синхронизация используется для решения проблем, которые могут возникнуть, когда несколько потоков получают доступ одновременно.
Механизм синхронизации может быть реализован с использованием синхронизированного ключевого слова.
Когда синхронизированное ключевое слово изменяет метод, метод называется методом синхронизации.
Когда выполняется синхронизированный метод или происходит исключение, блокировка будет автоматически выпущена.
Ниже приведен пример для анализа использования синхронизированных ключевых слов.
1. Дифференциальное использование синхронизированных ключевых слов
Пример программы 1
public Class Threadtest {public static void main (string [] args) {example anvess = new example (); Потока T1 = новый Thread1 (пример); Поток t2 = new Thread1 (пример); t1.start (); t2.start (); }} Пример класса {public synchronized void execute () {for (int i = 0; i <10; ++ i) {try {thread.sleep (500); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("hello:" + i); }}} Thread1 Class Extends Thread {Private Пример примера; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.execute (); }} Способно ли подготовить синхронизированное ключевое слово в методе execute (), результаты выполнения этой программы примера будут очень разными.
Если синхронизированное ключевое слово не добавлено, два потока выполняют метод execute () одновременно, а выход - две группы одновременных.
Если добавлено синхронизированное ключевое слово, сначала будет выведен набор от 0 до 9, а затем будет выведен следующий набор, указывающий, что два потока выполняются в последовательности.
2. Многопользовательская ситуация с несколькими методами
Измените программу и добавьте другой метод execute2 () в пример класса.
Затем напишите потоковое значение Thread Class2. Метод run () в Thread2 выполняет execute2 (). Оба метода в примере класса изменяются с помощью синхронизированного ключевого слова.
Пример программы 2
public Class Threadtest {public static void main (string [] args) {example anvess = new example (); Потока T1 = новый Thread1 (пример); Поток t2 = new Thread2 (пример); t1.start (); t2.start (); }} пример класса {public synchronized void execute () {for (int i = 0; i <20; ++ i) {try {thread.sleep ((long) math.random () * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("hello:" + i); }} public synchronized void execute2 () {for (int i = 0; i <20; ++ i) {try {thread.sleep ((long) math.random () * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("World:" + i); }}} Thread1 Class Extends Thread {Private Пример примера; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.execute (); }} Thread2 Class Extends Thread {Private Пример; public Thread2 (пример примера) {this.example = Пример; } @Override public void run () {example.execute2 (); }} Если синхронизированное ключевое слово удалено, два метода выполняются одновременно и не имеют взаимного влияния.
Но как написано в примере подпрограммы, даже два метода:
Результатом выполнения всегда является вывод одного потока, а затем выполнение другого потока.
иллюстрировать:
Если у объекта есть несколько синхронизированных методов, а поток ввел синхронизированный метод в определенный момент, то другие потоки не могут получить доступ к каким -либо синхронизированным методам объекта до выполнения метода.
в заключение:
Когда синхронизированное ключевое слово изменяет метод, метод называется методом синхронизации.
Каждый объект в Java имеет блокировку или монитор. Когда поток обращается к синхронизированному методу объекта, объект заблокирован, и ни один другой поток не может получить доступ к синхронизированному методу объекта (здесь относится ко всем методам синхронизации, а не только к одному и тому же методу). Только когда предыдущий поток завершает метод выполнения (или бросает исключение), отпускается блокировка объекта, так что другие потоки могут снова получить доступ к синхронизированному методу объекта.
Обратите внимание, что объект заблокирован в это время. Если это другой объект, между объектами нет ограничений.
При попытке построить второй объект потока в коде, вносятся новый объект примера, тогда нет никаких ограничений между выполнением двух потоков.
3. Рассмотрим методы статической синхронизации
Когда метод модифицированного синхронизированного ключевого слова также изменяется Static, ранее было сказано, что нестатическая метод синхронизации будет блокировать объект, но статический метод принадлежит объекту, а классу, и он будет блокировать объект класса класса, где находится этот метод.
Независимо от того, сколько объектов генерирует класс, они соответствуют одному и тому же объекту класса.
Пример программы 3
public Class Threadtest {public static void main (string [] args) {example anvess = new example (); Потока T1 = новый Thread1 (пример); // Даже если здесь проходят разные объекты, синхронизация статического метода по -прежнему не позволяет нескольким потокам выполняться одновременно. Пример = новый пример (); Поток t2 = new Thread2 (пример); t1.start (); t2.start (); }} пример класса {public synchronized static void execute () {for (int i = 0; i <20; ++ i) {try {thread.sleep ((long) math.random () * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("hello:" + i); }} public synchronized static void execute2 () {for (int i = 0; i <20; ++ i) {try {thread.sleep ((long) math.random () * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("World:" + i); }}} Thread1 Class Extends Thread {Private Пример примера; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.execute (); }} Thread2 Class Extends Thread {Private Пример; public Thread2 (пример примера) {this.example = Пример; } @Override public void run () {example.execute2 (); }} Таким образом, если это статический метод (execute () и execute2 (), оба имеют добавленные статические ключевые слова), даже если различные примеры объектов передаются в два потока, два потока все еще ограничены друг другу. Сначала нужно выполнить, а затем следующий.
в заключение:
Если синхронизированный метод является статическим, когда поток обращается к методу, он блокирует не объект, где находится синхронизированный метод, а объект класса, соответствующий классу, где находится синхронизированный метод. В Java, независимо от того, сколько объектов имеет класс, эти объекты будут соответствовать уникальному объекту класса. Следовательно, когда поток обращается к двум статическим и синхронизированным методам двух объектов одного класса, их порядок выполнения также является последовательным, то есть один поток сначала выполняет метод, а другой поток начинается после завершения выполнения.
4. Синхронизированный блок
Синхронизированный метод написания блоков:
синхронизированный (объект) {} Это означает, что поток будет блокировать объект объекта, когда он будет выполнен. (Обратите внимание, что этот объект может быть объектом любого класса, или вы можете использовать это ключевое слово).
Таким образом, вы можете указать заблокированный объект самостоятельно.
Пример программы 4
public Class Threadtest {public static void main (string [] args) {example anvess = new example (); Потока T1 = новый Thread1 (пример); Поток t2 = new Thread2 (пример); t1.start (); t2.start (); }} пример класса {private object = new Object (); public void execute () {synchronized (object) {for (int i = 0; i <20; ++ i) {try {thread.sleep ((long) math.random () * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("hello:" + i); }}} public void execute2 () {synchronized (object) {for (int i = 0; i <20; ++ i) {try {thread.sleep ((long) math.random () * 1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("World:" + i); }}}}} Thread1 Class Extends Thread {Private Example пример; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.execute (); }} Thread2 Class Extends Thread {Private Пример; public Thread2 (пример примера) {this.example = Пример; } @Override public void run () {example.execute2 (); }} Эффект, достигаемый примером программы 4, такой же, как и в примере программы 2. Оба потока выполняются в последовательности, а не одновременно. Когда один поток выполняется, объект объекта заблокирован, а другой поток не может выполнить соответствующий блок.
Синхронизированный метод фактически эквивалентен обертыванию всех операторов в метод с помощью синхронизированного блока, а затем передает это ключевое слово в кронштейнах синхронизированного блока. Конечно, если это статический метод, объект класса должен быть заблокирован.
Возможно, только несколько строк кода в методе будут включать в себя проблемы синхронизации потоков, поэтому синхронизированный блок контролирует доступ к нескольким потокам более гранулярно, чем синхронизированный метод. Только содержание в синхронизированном блоке не может быть доступен с помощью нескольких потоков одновременно, а другие операторы в методе все еще могут быть доступны с помощью нескольких потоков одновременно (включая до и после синхронизированного блока).
Примечание. Данные, защищенные синхронизированными, должны быть частными.
в заключение:
Синхронизированный метод является крупнозернистым параллельным контролем. В определенный момент только один поток может выполнить синхронизированный метод;
Синхронизированный блок-это мелкозернистый контроль параллелизма, который только синхронизирует код в блоке. Другие коды, расположенные в методе, и в отличие от синхронизированных блоков, могут быть доступны несколькими потоками одновременно.