Статья разделяет 4 примера подробного объяснения синхронизации
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 nuck () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Excute:" + i); }}} Thread1 Class Extends Thread {Private Пример примера; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.excute (); }}Выходной результат синхронизированного ключевого слова заключается в следующем
Сначала будет выведен набор 0-4, а затем будет выведен следующий набор, и два потока будут выполнены в последовательности.
Избыток: 0
Избыток: 1
Избыток: 2
Избыток: 3
Избыток: 4
Избыток: 0
Избыток: 1
Избыток: 2
Избыток: 3
Избыток: 4
Выходной результат синхронизированного ключевого слова заключается в следующем
Два потока выполняют чрезмерный метод одновременно и одновременно
Избыток: 0
Избыток: 0
Избыток: 1
Избыток: 1
Избыток: 2
Избыток: 2
Избыток: 3
Избыток: 3
Избыток: 4
Избыток: 4
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 nuck () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Excute:" + i); }} public synchronized void nuck1 () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Excute1:" + i); }}} Thread1 Class Extends Thread {Private Пример примера; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.excute (); }} Thread2 Class Extends Thread {Private Пример; public Thread2 (пример примера) {this.example = Пример; } @Override public void run () {example.excute1 (); }}Результаты выполнения следующие
То же самое выполняется в последовательности, и один поток выполняется до выполнения другого потока.
Избыток: 0
Избыток: 1
Избыток: 2
Избыток: 3
Избыток: 4
Excute1: 0
Excute1: 1
Excute1: 2
Excute1: 3
Exclusive1: 4
Если синхронизированное ключевое слово удалено, два метода выполняются одновременно и не имеют взаимного влияния.
Но как написано в примере подпрограммы, даже два метода:
Результатом выполнения всегда является вывод одного потока, а затем выполнение другого потока.
иллюстрировать:
Если у объекта есть несколько синхронизированных методов, а поток ввел синхронизированный метод в определенный момент, то другие потоки не могут получить доступ к каким -либо синхронизированным методам объекта до выполнения метода.
в заключение:
Когда синхронизированное ключевое слово изменяет метод, метод называется методом синхронизации.
Каждый объект в Java имеет блокировку или монитор. Когда поток обращается к синхронизированному методу объекта, объект заблокирован, и ни один другой поток не может получить доступ к синхронизированному методу объекта (здесь относится ко всем методам синхронизации, а не только к одному и тому же методу). Только когда предыдущий поток завершает метод выполнения (или бросает исключение), отпускается блокировка объекта, так что другие потоки могут снова получить доступ к синхронизированному методу объекта.
Обратите внимание, что объект заблокирован в это время. Если это другой объект, между объектами нет ограничений.
При попытке построить второй объект потока в коде, вносятся новый объект примера, тогда нет никаких ограничений между выполнением двух потоков.
3. Метод статической синхронизации
Когда метод модифицированного синхронизированного ключевого слова также изменяется Static, ранее было сказано, что нестатическая метод синхронизации будет блокировать объект, но статический метод принадлежит объекту, а классу, и он будет блокировать объект класса класса, где находится этот метод.
public Class Threadtest {public static void main (string [] args) {example anvess = new example (); Пример пример2 = новый пример (); Потока T1 = новый Thread1 (пример); Потока t2 = new Thread2 (пример2); t1.start (); t2.start (); }} пример класса {public synchronized static void nuck () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Excute:" + i); }} public synchronized static void nuck1 () {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Excute1:" + i); }}} Thread1 Class Extends Thread {Private Пример примера; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.excute (); }} Thread2 Class Extends Thread {Private Пример; public Thread2 (пример примера) {this.example = Пример; } @Override public void run () {example.excute1 (); }}Результаты выполнения следующие
Избыток: 0
Избыток: 1
Избыток: 2
Избыток: 3
Избыток: 4
Excute1: 0
Excute1: 1
Excute1: 2
Excute1: 3
Exclusive1: 4
Если нет статического модификатора, а два потока проходят разные объекты, они будут выполнены одновременно одновременно.
Таким образом, если это статический метод (execute () и execute2 (), оба имеют добавленные статические ключевые слова), даже если различные примеры объектов передаются в два потока, два потока все еще ограничены друг другу. Сначала нужно выполнить, а затем следующий.
в заключение:
Если синхронизированный метод является статическим, когда поток обращается к методу, он блокирует не объект, где находится синхронизированный метод, а объект класса, соответствующий классу, где находится синхронизированный метод. В Java, независимо от того, сколько объектов имеет класс, эти объекты будут соответствовать уникальному объекту класса. Следовательно, когда поток обращается к двум статическим и синхронизированным методам двух объектов одного класса, их порядок выполнения также является последовательным, то есть один поток сначала выполняет метод, а другой поток начинается после завершения выполнения.
4. Синхронизированный блок
синхронизированный (объект)
{
}
Это означает, что поток будет блокировать объект объекта, когда он будет выполнен. (Обратите внимание, что этот объект может быть объектом любого класса, или вы можете использовать это ключевое слово).
Таким образом, вы можете указать заблокированный объект самостоятельно.
public Class Threadtest {public static void main (string [] args) {example anvess = new example (); Потока T1 = новый Thread1 (пример); Поток t2 = new Thread2 (пример); t1.start (); t2.start (); }} пример класса {public void nuck () {synchronized (this) {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Excute:" + i); }}} public void nuck1 () {synchronized (this) {for (int i = 0; i <5; ++ i) {try {thread.sleep (1000); } catch (прерванное искусство e) {e.printstacktrace (); } System.out.println ("Excute1:" + i); }}}}}} Thread1 Class Extends Thread {Private Пример пример; public Thread1 (пример примера) {this.example = Пример; } @Override public void run () {example.excute (); }} Thread2 Class Extends Thread {Private Пример; public Thread2 (пример примера) {this.example = Пример; } @Override public void run () {example.excute1 (); }}Результаты выполнения следующие
Избыток: 0
Избыток: 1
Избыток: 2
Избыток: 3
Избыток: 4
Excute1: 0
Excute1: 1
Excute1: 2
Excute1: 3
Exclusive1: 4
Эффект, достигаемый примером программы 4 , такой же, как и в примере программы 2. Оба потока выполняются в последовательности, а не одновременно. Когда один поток выполняется, объект объекта заблокирован, а другой поток не может выполнить соответствующий блок.
Синхронизированный метод фактически эквивалентен обертыванию всех операторов в метод с помощью синхронизированного блока, а затем передает это ключевое слово в кронштейнах синхронизированного блока. Конечно, если это статический метод, объект класса должен быть заблокирован.
Возможно, только несколько строк кода в методе будут включать в себя проблемы синхронизации потоков, поэтому синхронизированный блок контролирует доступ к нескольким потокам более гранулярно, чем синхронизированный метод. Только содержание в синхронизированном блоке не может быть доступен с помощью нескольких потоков одновременно, а другие операторы в методе все еще могут быть доступны с помощью нескольких потоков одновременно (включая до и после синхронизированного блока).
в заключение:
Синхронизированный метод является крупнозернистым параллельным контролем. В определенный момент только один поток может выполнить синхронизированный метод;
Синхронизированный блок -это мелкозернистый контроль параллелизма, который только синхронизирует код в блоке. Другие коды, расположенные в методе, и в отличие от синхронизированных блоков, могут быть доступны несколькими потоками одновременно.
Выше приведено о методе синхронизированной синхронизации блоков многопоточного программирования Java. Я надеюсь, что это будет полезно для каждого обучения.