Когда я впервые увидел этот вопрос, я не мог начать, потому что я чувствовал, что синхронизированный и блокировка были очень разными с точки зрения блокировки. Например, посмотрите, как блокировать при синхронизации при нормальных обстоятельствах.
Метод 1:
Публичный синхронизированный void a () {// todo}Метод 2:
public void b () {synchronized (this) {// todo}}Из этих двух способов добавляется блокировка между {}. Давайте посмотрим на то, как закончится замок:
public void c () {lock.lock (); try {// todo} наконец {lock.unlock (); }}Этот способ блокировки добавляется между Lock () и разблокированным (). Поэтому, если вы хотите реализовать функцию блокировки, вам нужно подумать о том, как реализовать эти два метода, Lock () и разблокировать () методы сначала определите структуру следующим образом:
public void lock () {} public void unlock () {}Затем вы должны подумать о том, как использовать синхронизированный для реализации этих двух методов.
Теперь я немного яснее, но я не знаю, как заполнить эти два метода. Вот как проанализировать характеристики блокировки блокировки, а затем взглянуть на этот код:
public void c () {lock.lock (); // Когда текущий поток получает блокировку, другой поток должен ждать try {// текущий поток Get In Lock, другой поток не может получить в // todo}, наконец, {lock.unlock (); // Текущий поток выпустить блокировку}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}Я только что добавил небольшой комментарий к этому коду и ничего не сделал. Помогает ли это понять этот код и посмотреть, какое самое частые слова, CurrentThread? Поэтому, когда мы заполняем методы Lock () и разблокировать (), должны ли мы обратить внимание на захват ключевого слова CurrentThread, чтобы найти решение? Ответ да.
Затем проанализируйте, как заставить поток подождать при использовании синхронизации? Это использовать метод wait (). Как разбудить ветку? Он использует метод notify (). Затем вам необходимо использовать метод wait () в методе Lock () и метод natify () в методе разблокировки (). Поэтому, когда мы используем wait () и уведомление (), у нас есть условие. Подумайте о том, что мы должны использовать в качестве условия?
Мы должны использовать, занят ли текущая блокировка в качестве условия суждения. Если замок занят, то CurrentHread ожидайте. Подумайте о том, использовали ли мы это условие при использовании синхронизации. Ответ да.
Давайте проанализируем, когда выпустить блокировку и какие условия используются. Подумайте о том, получает ли резьба A блокировка, можно ли выпустить поток B? Конечно, нет. Если B может быть освобожден, он нарушает принцип, конечно, нет. Это определенно то, что блокировка потока A может быть выпущена только. Следовательно, условие суждения состоит в том, чтобы судить, является ли поток, удерживающий блокировку, текущей. Если это так, это может быть выпущено, но, конечно, это не может.
Давайте посмотрим на полный код сейчас:
Package Test.lock; импорт java.util.random; import java.util.concurrent.executorservice; import java.util.concurrent.executors; импорт java.util.concurrent.treadfactory. Синхронизированный void lock () {long currentThreadId = thread.currentThread (). getId (); if (владелец == currentThreadId) {throw new allodalStateException («lock был получен с помощью текущего потока»);} while (this.islooked ()) {system.out.println (string.format ("thread %smocktyd) {wait ();} catch (прерывание Exception e) {e.printStackTrace ();}} владелец = currentThreadId; System.out.println (String.format («Замок получен по потоке %s", владелец));} public synchronized void unlock () {if (! new IllegalStateException("Only Lock owner can unlock the lock");}System.out.println(String.format("thread %s is unlocking", owner));System.out.println();owner = NONE;notify();}public static void main(String[] args) {final NaiveLock lock = new NaiveLock();ExecutorService executor = Executors.newfixedthreadpool (20, new Threadfactory () {private ThreadGroup Group = new ThreadGroup ("Test Thread Group"); {Group.setDaemon (true);}@Replice Public Thread Newthread (Runnable R) {return New Thread (Group, r);}}); для (int i = 0; i <20; {@Override public void run () {lock.lock (); System.out.println (string.format ("Thread %s работает ...", thread.currentThread (). GetId ())); try {thread.slees {e.printstacktrace ();} lock.unlock ();}});}}}Запустите его и посмотрите результаты:
Заблокируется, получена в потоке 8 резьба 8, запускается ... потока 27 - это ждет блокировка. Поток блокировки witch Lock Thede 25 - это withlock lock neak 24 witing Lock Thread is wating Lock Thread 22 - это ждет блокировка. Поток заблокированная блокировка. Поток заблокированная Блосая Поток 19 Поток блокировка 27 thread 27 is running... thread 27 is unlocking Lock is acquired by thread 26 thread 26 is running... thread 26 is unlocking Lock is acquired by thread 25 thread 25 is running... thread 25 is unlocking Lock is acquired by thread 24 thread 24 is running... thread 24 is unlocking Lock is acquired by thread 23 thread 23 is running... thread 23 is unlocking Lock is acquired by thread 22 thread 22 is running... thread 22 is unlocking Lock is acquired by thread 21 thread 21 is running... thread 21 is unlocking Lock is acquired by Поток 20 Тема 20 работает ... Поток 20 разблокирует блокировка, полученная потоком 19 потока 19, запускается ... Поток 19 разблокируется блокировка, полученная потоком 18 Thread 18 запускается ... Поток 18 разблокируется блокировку, полученная по потоке 17 Thread 17 ... Thread 17 разблокирует Lock Brock, полученная потоком 16, запускается поток 16, заблокирует блокировка. По потоке 13 Тейд 13 работает ... Поток 13 разблокирует блокировка, полученная потоком 12 потока 12, запускается ... Поток 12 разблокирует блокировка, полученная по потоке 11 Тейд 11, запускается ... Поток 11 разблокируется блокировка получена по потоке 10 потока 10 запускается ... Поток 10 разблокируется блокировка, полученная потоком 9. Поток 9 запускается ... Поток 9 разблокируется.
Если вы измените цикл для петли до 30 раз, посмотрите на результаты:
Заблокируется, получена в потоке 8 резьба 8, запускается ... потока 27 - это ждет блокировка. Поток блокировки witch Lock Thede 25 - это withlock lock neak 24 witing Lock Thread is wating Lock Thread 22 - это ждет блокировка. Поток заблокированная блокировка. Поток заблокированная Блосая Поток 19 Поток блокировка 27 потоки 27 запускается ... Поток 8 - это заблокированная потока блокировки 27 - это разблокировка блокировки, полученная по потоке 27 Тейд 27, запускается ... Поток 26 - это то, что блокировка, заблокированная Поток 27 разблокирует блокировка, получен потоком 27. Поток 27 ... Поток 25 - это заблокированная блокировка. Является ли ждать блокировку. Поток 22 разблокирует блокировка, полученная по потоке 22 потока 22, запускается ... Поток 21 - это заблокированная потока блокировки 22 разблокируется блокировку, полученная по потоке 22 Поток 22, запускается ... Поток 20 - это то, что блокировка, заблокированная Поток 22 - это разблокировка блокировки, полученная потоком 22 Поток 22. Запуск поток 19 - это заблокированная блокировка. Поток 16 Thread 16 запущен ... потока 16 разблокирует блокировка, полученная потоком 15 потоком 15, запускается ... Поток 15 разблокирует блокировка, полученная по потоке 14 Thread 14. Запускается ... Поток 14 разблокируется блокировку, полученная по потоке 13 Поток 13 запускается ... Поток 13 разблокируется блокировку, полученная в потоке 12. По потоке 9 Поток 9 запускается ... Поток 9 разблокирует блокировка, полученная потоком 8 потоком 8, запускается ... Поток 8 разблокируется блокировка, полученная потоком 26 Thread 26 работает ... Поток 26 - это разблокировка блокировки получена по потоке 25 Поток 25 запускается ... Поток 25 разблокирует блокировка. Приобретено по потоке 21 Тейд 21 запускается ... Поток 21 разблокирует блокировка, полученная по потоке 20 потока 20 работает ... Поток 20 разблокирует блокировку, полученная по потоке 19. Запуск поток 19 запускается ... Поток 19 разблокируется блокировка, полученная потоком 18 потока 18 запускается ... Поток 18 разблокируется.
Суммировать
Выше приведено подробное объяснение этой статьи об использовании синхронизированного для реализации блокировки. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на этот сайт:
Пример кода блокировки блокировки блокировки блокировки блокировки блокировки блокировки блокировки блокировки блокировки
Разница между синхронизированной и блокировкой в программировании Java [рекомендуется]
Java MultiThreaded ReadWriteLock Read-Write Code Code
Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!