2015-01-08 2 views
1

У меня есть простой класс с связанного списка:Как поточно-безопасно манипулировать списками в Java?

private final LinkedList<Object> list; 

Если у меня есть два метода манипулирования в этом списке:

public void m1(){ ... list.poll()...} 

public void m2(){...list.clear)....} 

Как убедиться в ThreadSafety? Достаточно ли иметь оба метода получают «синхронизированного» ключевое слово, или я должен поставить

synchronized(list){ 
    System.out.println("locking on :" + lock); 
} 

вокруг метода-кода?

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

PS: Или это будет лучше размещено в CodeReview? Он чувствует себя здесь как-то здесь.

+1

Я бы предложил использовать 'Синхронизированный' только вокруг критических разделов, таких как' poll' и 'clear', а не по всему методу. – TheLostMind

+0

Также, как насчет методов типа 'add()' и 'remove()' ?. Вам также придется * синхронизировать * с ними? – TheLostMind

+0

Хорошо, в первую очередь: Спасибо, все ответы были полезны :). Из-за обстоятельств «существует существующая система вокруг этого», я закончил синхронизацию блока, который имел значение. Для почти всех других случаев я хотел бы указать http://stackoverflow.com/a/27838890/2286132 by atish shimpi. @TheLostMind: вы совершенно правы, это случилось так, что случаи, с которыми я имел дело, где заглядывать, опросить и очистить, так они оказались в этом примере! – Layna

ответ

2

Лучше сделать синхронизацию как можно конкретнее вместо маркировки всего метода с ключевым словом. Чем более утончена ваша синхронизация, тем лучше ваш код будет работать. Предложите последний код, который вы показали, и синхронизируйте его с одним и тем же замком при работе со списком среди потоков.

Как и в вашем случае, если вы делаете, как показано ниже, как вы показали, что это должно быть в порядке:

synchronized(list){ 
    // do something with your list 
    // synchronizing on the same lock makes sure other threads have to wait for this lock 
    // to be released. In your case you are using the list object as the lock. 
} 
5

Передайте свой список методу public static <T> List<T> synchronizedList(List<T> list) в классе java.util.Collections, чтобы создать безопасный список.

+0

Вам нужно будет увидеть, будет ли List без peek/poll работать в моей среде, но этот маленький фрагмент уверен, полезен, никогда не видел его раньше :) – Layna

1

java.util.Vector является поточно-безопасно, все методы в этом классе synchronized

1

Подсказка: Если вы собираетесь реализовать какой-то Producer/Consumer модели, использовать существующие инструменты - класс реализация "Blocking Queue" должна соответствовать вашим потребностям

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