4 Eylül 2018 Salı

SynchronizedRandomAccessList Sınıfı

Giriş
Bu sınıfı yaratmak için Collections.synchronizedList() çağrısına RandomAccess özelliğini destekleyen bir liste geçmek gerekir. Yani ArrayList.

constructor
Şöyle yaparız.
List list = Collections.synchronizedList(new ArrayList());
contains metodu
Metodun içi şöyle.
public boolean contains(Object o) {
  synchronized (mutex) {return c.contains(o);}
}
forEach metodu
Kendi içinde mutex'i kilitler
Örnek
Şöyle yaparız
List<Integer> list = Collections.synchronizedList(new ArrayList<>());
list.addAll(List.of(1, 2, 3, 4));

// Safe - lock taken inside of forEach on SynchcronizedList
list.forEach(System.out::println);

// Unsafe - lock needs to be taken in client code
synchronized (list) {
  list.stream().forEach(System.out::println);
}

// Unsafe - lock needs to be taken in client code
synchronized (list) {
  list.parallelStream().forEach(System.out::println);
}
iterator metodu
Açıklaması şöyle
It is imperative that the user manually synchronize on the returned list when traversing it via Iterator, Spliterator or Stream
Örnek
Şöyle yaparız.
List list = Collections.synchronizedList(new ArrayList());
...
synchronized(list) {
  Iterator i = list.iterator(); // Must be in synchronized block
  while (i.hasNext())
    foo(i.next());
}
remove metodu
Metodun içi şöyle.
public boolean remove(Object o) {
  synchronized (mutex) {return c.remove(o);}
}

Hiç yorum yok:

Yorum Gönder