2016-04-01 2 views
1

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

Я проверил свою стабильность реализации на большом количестве потоков, которые вставка и удаление из очереди,

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

public class BBQ<T> { 
private ArrayList<T> tasks; 
private Semaphore mutex; 
private Semaphore full; 
private Semaphore zero; 

public BBQ(int numofWorkers){ 
    tasks = new ArrayList<T>(); 
    mutex = new Semaphore(1, true); 
    full = new Semaphore(numofWorkers, true); 
    zero = new Semaphore(0, true); 
} 

public boolean add(T item) { 
    boolean ans = false; 

    try { 
     zero.acquire(); 
     mutex.acquire(); 
     ans = tasks.add(item); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    finally{ 
     mutex.release(); 
     full.release(); 

    } 
    return ans; 
} 

public boolean remove() { 
    boolean ans = false; 
    try { 
     full.acquire(); 
     mutex.acquire(); 
     if (tasks.remove(0) == null) { 
      ans = false; 
     } 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
    finally{ 
     mutex.release(); 
     zero.release(); 
    } 
    return ans; 
} 

public int size() { 
    return tasks.size(); 
} 

public String toString() { 
    return tasks.toString(); 
} 

ответ

0

Ваш size и toString не являются поточно. Нет никакого надежного способа проверить безопасность потоков, вам намного лучше писать код, который достаточно прост, чтобы его можно было понять и проверить.

Это, как говорится, не имеет большого испытания, поскольку это может привести к ошибке. (Отсутствие ошибки не означает, что оно является потокобезопасным)

Я бы использовал ExecutorService для добавления и удаления записей как можно быстрее и посмотреть, попадает ли он в состояние ошибки. В частности, каждый раз называть toString(), так как я уверен, что это не удастся, это то, что вы должны показать.

0

Я бы запустить 3 вида тестов, чтобы проверить свой блокирующий код:

  1. тестирование Тупик - Запуск вызывные темы с случайным задержки временного интервала. Тупики трудно воспроизвести, и случайные задержки чаще вызывают проблему. Из вашего кода не возникает никаких взаимоблокировок, так как последовательность блокировки одинакова.
  2. Производительность. Вы упомянули большое количество потоков. С вашим кодом блокировки, который вызовет задержки при выполнении более поздних потоков
  3. Тесты с несколькими процессорами. Вы можете протестировать это на нескольких виртуальных машинах vCPU, чтобы узнать, масштабируется ли это с несколькими процессорами. Я думаю, что это, возможно, не так как вы с использованием разделяемой памяти
0

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

вы можете использовать jcstress рамки. Он используется некоторыми инженерами Oracle для внутренних испытаний

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