2015-05-17 2 views
-1

Что происходит, когда состояние связано с замком, как это:Использование экземпляра условие с замком

Lock lock = new ReentrantLock(); 
Condition notFull = lock.newCondition(); 

Примером может быть ограниченный класс буфера, такие как here

Так что, когда, например, , вызываются методы notFull.await() и notFull.signal(), что ждет, когда их выйдет/что сигнализируется другим потокам, поскольку теперь они свободны в использовании.

Мое предположение заключалось в том, что в этом случае эти методы проверяют/сигнализируют состояние блокировки, заблокировано или разблокировано. Так, например, если был вызван lock.lock(), а затем вызывается notFull.await(), это приведет к тому, что поток, вызывающий метод notFull.await(), будет заблокирован/отправлен в очередь ожидания.

Правильно ли я с моим заключением?

ответ

0

Из documentation

замок, связанный с этим Condition атомарно выпущен и текущего потока становится недоступной для целей планирования потоков и бездействует, пока один из четырех вещей не бывает:

  • Некоторая другая нить вызывает метод сигнала для этого Condition, и текущая нить выбирается как нить в b пробужден; или
  • Некоторые другие потоки используют метод signalAll для этого Condition; или
  • Некоторые другие потоки прерывают текущую резьбу, и поддерживается прерывание подвески нити; или
  • Происходит «ложное пробуждение».

Так что-то нужно было бы назвать

notFull.signal(); 

или

notFull.signalAll(); 

или прервать нить ожидания, или поддельную просыпаться нужно будет происходить на ожидающий поток будет снова стал возможен.

+0

Спасибо. Мой вопрос был плохо сформулирован, но вы помогли указать мне в правильном направлении, хотя я уже прочитал документацию.Просто идет, чтобы показать, что чтение вещи дважды никогда не болит. Ура! –

+0

@ OmarSharaki Рассмотрите вопрос о том, как это сделать. –

+0

Я сделал. Надеюсь, теперь это станет более полезным для других. –

0

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

Аналогичным образом потребитель, который изменил состояние с полного на неполное, удалив элемент, вызовет notFull.notify(), чтобы пробудить производителя, который был заблокирован в вызове notFull.await().

-1
package com.testjava; 

import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
import java.util.concurrent.Future; 
import java.util.concurrent.locks.Condition; 
import java.util.concurrent.locks.Lock; 
import java.util.concurrent.locks.ReentrantLock; 
//=========== Task1 class prints odd ===== 
class TaskClass1 implements Runnable 
{ 

    private Condition condition; 
    private Lock lock; 
    boolean exit = false; 
    int i; 
    TaskClass1(Condition condition,Lock lock) 
    { 
     this.condition = condition; 
     this.lock = lock; 
    } 
    @Override 
    public void run() { 
     try 
     { 
      lock.lock(); 
      for(i = 1;i<11;i++) 
      { 
       if(i%2 == 0) 
       { 
        condition.signal(); 
        condition.await(); 

       } 
       if(i%2 != 0) 
       { 
        System.out.println(Thread.currentThread().getName()+" == "+i); 

       } 

      } 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally 
     { 
      lock.unlock(); 
     } 

    } 

} 
//==== Task2 : prints even ======= 
class TaskClass2 implements Runnable 
{ 

    private Condition condition; 
    private Lock lock; 
    boolean exit = false; 
    TaskClass2(Condition condition,Lock lock) 
    { 
     this.condition = condition; 
     this.lock = lock; 
    } 
    @Override 
    public void run() { 
     int i; 
     // TODO Auto-generated method stub 
     try 
     { 
      lock.lock(); 
      for(i = 2;i<11;i++) 

      { 

       if(i%2 != 0) 
       { 
        condition.signal(); 
        condition.await(); 
       } 
       if(i%2 == 0) 
       { 
        System.out.println(Thread.currentThread().getName()+" == "+i); 

       } 

      } 

     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally 
     { 
      lock.unlock(); 

     } 

    } 

} 
public class OddEven { 

    public static void main(String[] a) 
    { 
     Lock lock = new ReentrantLock(); 
     Condition condition = lock.newCondition(); 
     Future future1; 
     Future future2; 
     ExecutorService executorService = Executors.newFixedThreadPool(2); 

     future1 = executorService.submit(new TaskClass1(condition,lock)); 
     future2 = executorService.submit(new TaskClass2(condition,lock)); 
     executorService.shutdown(); 


    } 


} 
+0

. Вам нужно объяснить, как ваш дамп кода отвечает на вопрос. –

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