2013-11-01 2 views
4

Я очень плохо разбираюсь в концепции MultiThreading Java.Случай использования ReentrantLock

Я использовал функции и использование ReentrantLock. Я понял, что он более гибкий, а затем синхронизирован и добавляет еще несколько функций.

Я вижу примеры, упомянутые на нем, и я получил это хорошо.

Я не могу понять сценарий реального времени, где именно он будет полезен в бизнесе.

Я вижу, что лучше избегать взаимоблокировок.

Может ли кто-то предоставить прецедент, где без ReentrantLock будет трудно решить такой вариант использования.

или может указать на какую-то ссылку.

+0

Я прошу использовать в реальной жизни (сценарий), где это необходимо для использования такой блокировки и синхронизации, не поможет в такой ситуации. Я знаю функции ReentrantLock. – Jayesh

ответ

2

Для простейшего случая, как насчет временной блокировки/частичной блокировки приложения, требующего производительности.

Очень распространенный пример - это интернет-порталы, которые позволяют вам покупать/заказывать билеты (любые). Вы получаете блокировку времени на интересующем вас месте/ресурсе. По истечении времени и если транзакция не завершена, любое другое клиентское приложение (поток) может получить блокировку на нем.

+0

Ницца, просто для любопытства, я спрашиваю, красный автобус/bookmyshow или любое бронирование происходит для места таким образом? – Jayesh

+0

Я бы не сказал, что их база кода находится на Java, и они используют ReentrantLock для синхронизации, но механизм аналогичен. –

+0

В [ReentrantLock] нет методов (https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/ReentrantLock.html), который дает мне блокировку на определенный период, хотя У меня есть варианты, чтобы попытаться заблокировать в течение ограниченного времени, так как временный вариант использования блокировки предоставляется ReentrantLock? Я что-то не понял? –

4

ReentrantLock может использоваться для требований времени ожидания. Предположим, вы пытаетесь получить блокировку, но блокировка уже выполнена в этот момент, вы можете использовать tryLock(), который будет немедленно возвращен, а позже вы можете попробовать еще раз.

ReentrantLock имеет некоторые другие преимущества быть обеспечивают fairLock или несправедливого его мошенника структуры:

public ReentrantLock(boolean fair) 

если поставить fair в false, чем он не предоставит вам замок с справедливым заказом. И несправедливо заказ выставляет справедливый замок. Я могу объяснить это, если вам нужно больше деталей.

Но проблема с ReentrantLock заключается в том, что ее трудно отлаживать, потому что в журналах она не может объяснить о владельце блокировки, но в синхронизации это возможно. Это самый большой недостаток.

Вы можете реализовать такие функции, как столовый философ с этим механизмом блокировки. Если обе палочки доступны, чем идти вперед, и есть еще одну вещь, которую вы сейчас держите.

public void run() { 
    while (!Thread.currentThread().isInterrupted()) { 
     if (l.getLeftLock().tryLock()) { 
      try { 
       if (r.getRightLock().tryLock()) { 
        try { 
         System.out.println("Eating philosopher1 !!!!"); 
        } finally { 
         r.getRightLock().unlock(); 
        } 
       } 
      } finally { 
       l.getLeftLock().unlock(); 
      } 

     } 
     try { 
      Thread.currentThread().sleep((int) (100 * Math.random())); 
     } catch (InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
    } 
} 
+0

Что вы говорите мне, это функции ReentrantLock, я прошу использовать в реальной жизни (сценарий), где необходимо использовать такую ​​блокировку и синхронизацию, в такой ситуации не поможет. – Jayesh

+0

@Jayesh Я думаю, что это очень очевидно, что ответ. Я приведу вам очень хороший пример, вы можете реализовать такие функции, как обеденный философ с этим механизмом блокировки. Если обе палочки доступны, чем идти вперед, и есть еще одну вещь, которую вы держите. Вы поняли? – Trying

1

Для ReentrantLock класса, по сравнению с простым synchronized на мой взгляд, основные преимущества:

  • приобретают/снятия блокировки в разных блоках.
  • имеют справедливые замки (FIFO для ожидающих потоков)
  • может попытаться заблокировать
  • может иметь несколько переменных условие

Кроме того, немного не по теме, но для понимания Java параллельных классов, я нашел Java Concurrent Animated очень полезно. Загрузите файл runnable jar и посмотрите сами.

Смежные вопросы