Operacje i zmienne atomowe w strumieniach

0

Potrzebuje pomocy w zrozumieniu tego jak działają zmienne atomowe.
ostatnio spotkałem się z pewnym rozwiązaniem stosującym metodę .getAndSet.

       AtomicBoolean first = new AtomicBoolean(false);

streamOfCompany()
                .map(Company::getName)
                .collect(Collector.of(StringBuilder::new,
                        (stringBuilder, s) -> {
                            System.out.println(first);
                            if (first.getAndSet(true)) {
                                stringBuilder.append("+");
                            }
                            stringBuilder.append(s);
                        },
                        StringBuilder::append,
                        StringBuilder::toString));

Nie rozumiem w jakie sposób metoda .getAndSet wywołana na zmiennej typu AtomicBoolean naprzemiennie zwraca true i false.
Tym bardziej, że jeśli wywołuję tą metodę poza strumieniem to zawsze zwraca true (z wyjątkiem pierwszego razu ofcourse)

        AtomicBoolean first = new AtomicBoolean(false);
        System.out.println("+++++++++++++");
        System.out.println("first: " + first);
        System.out.println("first result getAndSet is " + first.getAndSet(true));
        System.out.println("first: " + first);
        System.out.println("second result getAndset is: " + first.getAndSet(true));
        System.out.println("third getAndSet: " + first.getAndSet(true));
        System.out.println("fourth getAndSet: " + first.getAndSet(true));

1

A możesz pokazać minimalny przykład (bez jakichś twoich klas i innych cudów) który pokazuje ten problem?

0

Zmienne atomowe to taki twór, który nie jest trzymany w cache procesora, ale dany wątek zawsze, aby się do takiej zmiennej dobrać, musi się odnieść do pamięci RAM.
Zatem logika podpowiada, że jeśli nie chcesz przykatować i spowolnić przetwarzania swojego strumienia to lepiej tego unikać.

No i nie ma raczej uzasadnionego powodu aby korzystać ze zmiennych atomowych wg mnie. Jest tylko błędnie zaprojektowany obiekt, który jest przetwarzany w strumieniu. Powinien być unmutable.

1
NeutrinoSpinZero napisał(a):

Zmienne atomowe to taki twór, który nie jest trzymany w cache procesora, ale dany wątek zawsze, aby się do takiej zmiennej dobrać, musi się odnieść do pamięci RAM.

Coś jakbyś mylił z volatile. Atomowe, to o wiele więcej niż volatile. Atomowść zakłada jakiś stopień synchronizacji

Zatem logika podpowiada, że jeśli nie chcesz przykatować i spowolnić przetwarzania swojego strumienia to lepiej tego unikać.

No i nie ma raczej uzasadnionego powodu aby korzystać ze zmiennych atomowych wg mnie. Jest tylko błędnie zaprojektowany obiekt, który jest przetwarzany w strumieniu. Powinien być unmutable.

Czasem nie ma wyjścia, i musi być mutable.
A tu akurat mówisz senswonie o atomowych

0

@Shalom @AnyKtokolwiek dzięki za sprostowanie :) Przynajmniej dowiedziałem się, że muszę się dalej uczyć :)

1

Nie rozumiem w jakie sposób metoda .getAndSet wywołana na zmiennej typu AtomicBoolean naprzemiennie zwraca true i false.

Yyy na pewno? W którym miejscu podczas wykonania strumienia jest ustawiane false?

3

Przy okazji - łatwo widać, że pytający stworzył jadną z bardziej pokrętnych implementacji String.join.

1 użytkowników online, w tym zalogowanych: 0, gości: 1