eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.comp.programmingOpowiadanie o GCRe: Opowiadanie o GC
  • Path: news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!new
    s.nask.pl!news.nask.org.pl!goblin1!goblin.stu.neva.ru!postnews.google.com!r38g2
    000yqn.googlegroups.com!not-for-mail
    From: Maciej Sobczak <s...@g...com>
    Newsgroups: pl.comp.programming
    Subject: Re: Opowiadanie o GC
    Date: Mon, 3 Aug 2009 00:49:21 -0700 (PDT)
    Organization: http://groups.google.com
    Lines: 109
    Message-ID: <6...@r...googlegroups.com>
    References: <t...@4...com>
    <1...@2...googlegroups.com>
    <h4s021$8ca$1@mx1.internetia.pl>
    <n...@4...com>
    <h4s5hh$h68$1@mx1.internetia.pl>
    <b...@4...com>
    <h4saip$1bg$1@mx1.internetia.pl>
    <1...@4...com>
    <8...@o...googlegroups.com>
    <l...@4...com>
    <7...@n...googlegroups.com>
    <3...@k...googlegroups.com>
    NNTP-Posting-Host: 137.138.182.236
    Mime-Version: 1.0
    Content-Type: text/plain; charset=ISO-8859-2
    Content-Transfer-Encoding: quoted-printable
    X-Trace: posting.google.com 1249285762 3147 127.0.0.1 (3 Aug 2009 07:49:22 GMT)
    X-Complaints-To: g...@g...com
    NNTP-Posting-Date: Mon, 3 Aug 2009 07:49:22 +0000 (UTC)
    Complaints-To: g...@g...com
    Injection-Info: r38g2000yqn.googlegroups.com; posting-host=137.138.182.236;
    posting-account=bMuEOQoAAACUUr_ghL3RBIi5neBZ5w_S
    User-Agent: G2/1.0
    X-HTTP-UserAgent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.0.12)
    Gecko/2009070609 Firefox/3.0.12,gzip(gfe),gzip(gfe)
    Xref: news-archive.icm.edu.pl pl.comp.programming:182967
    [ ukryj nagłówki ]

    On 1 Sie, 23:53, Piotr Lipski <l...@g...com> wrote:

    > Jak wół stoi:
    >
    > "Like most collection classes, this class is not synchronized.

    Zabawa polega na tym, że to nie jest takie proste.

    Specyfikacja Javy (JLS) w rozdziale o wątkach a konkretnie o
    współdzieleniu danych (17.4.1) pisze:

    "Two accesses to (reads of or writes to) the same variable are said to
    be conflicting if at least one of the accesses is a write."

    Czyli wiele wątków *czytających* te same dane nie stanowi problemu.
    Można stworzyć jakąś wartość (ogólnie: *strukturę danych*), zapewnić
    jej widoczność i bez problemu czytać ją z wielu wątków. To jest
    gwarantowane przez specyfikację języka.
    BTW - stąd właśnie bierze się eksponowanie pomysłu na klasy
    "immutable" w książce, którą polecał A.L. - obiekty niezmienne mogą
    być używane przez wiele wątków równocześnie nie dlatego, że jest w
    nich jakaś magia, tylko właśnie dlatego, że wtedy nie ma
    konfliktujących zapisów.

    W szczególności z tej gwarancji bierze się też pomysł na read-write
    locks. One zapewniają odpowiednie relacje następstwa zdarzeń i
    zapewniają też, że nie ma konfliktujących dostępów.
    Ze specyfikacji języka wynika, że *KAŻDĄ* strukturę danych można
    bezpiecznie czytać z wielu wątków, jeśli się zagwarantuje, że nie ma
    konfliktujących zapisów.

    Jeżeli piszesz kod sam, od zera, to wiesz, które operacje są odczytem
    a które zapisem i stąd też wiesz, które z nich mogą być równoczesne.
    Jeśli jednak używasz enkapsulowanych struktur danych (znanych również
    jako kolekcje), to informacja o tym które operacje są modyfikujące a
    które nie musi się znaleźć w dokumentacji.

    Moje pytanie w pełnej wersji: czy get() w WeakHashMap jest operacją
    modyfikującą? Jeżeli nie, to na mocy powyższego paragrafu można wołać
    get() z różnych wątków (i w szczególności ReadWriteLock można użyć do
    synchronizacji, wbrew temu, co twierdził A.L.).

    *To* jest właśnie pytanie, któro tutaj zadałem.

    Ale idźmy dalej. Zacytowałeś o WeakHashMap (A.L. zacytował to samo),
    że:

    "Like most collection classes, this class is not synchronized."

    I tyle. Nic więcej. Może poszukamy analogii?
    Jaka klasa kolekcji jest podobna do WeakHashMap? Może HashMap?
    Z dokumentacji o HashMap:

    "Note that this implementation is not synchronized. If multiple
    threads access a hash map concurrently, *AND* at least one of the
    threads *MODIFIES* the map structurally, it must be synchronized
    externally."

    Czyli jasno i wołami napisane, że klasa nie jest synchronizowana (tak
    samo napisali o WeakHashMap) - ale napisali też, że synchronizacja
    musi być zapewniona, jeśli jakiś wątek modyfikuje mapę w czasie gdy
    inne ją czytają. A jeśli nie modyfikuje, to *nie musi*.

    Oczywiście można pospekulować, że WeakHashMap jest potencjalnie
    modyfikowana przez osobny wątek (przez GC). Ale wiemy też, że
    modyfikacje wykonywane przez GC są bezpieczne (zresztą i tak nie
    byłoby jak tych operacji synchronizować) i nie stanowią konfliktu z
    wywołaniami funkcji get().

    W skrócie:
    1. Wiele wątków może czytać dowolną strukturę danych (patrz JLS).
    2. Z dokumentacji WeakHashMap nie wynika, aby operacja get() była
    modyfikatorem.

    Wniosek 1: wiele wątków *może* czytać jedną mapę.
    Wniosek 2: ReadWriteLock jest wystarczającym narzędziem do
    synchronizacji mapy.

    Chętnie się dowiem, że nie mam racji - ale poproszę o lepsze
    argumenty.
    Dotychczasowe argumenty są powierzchowne i nie odzwierciedlają
    problemu.

    Można oczywiście powołać się na jakąś (nawet oficjalną) istniejącą
    implementację, w której get() jest modyfikatorem. Wtedy oczywiście
    ReadWriteLock nie wystarcza.
    Ale wtedy też będziemy mieli dwie opcje:
    - uznać, że dokumentacja jest do dupy i nie opisuje rzeczywistości
    - uznać, że implementacja jest do dupy i nie działa zgodnie ze
    specyfikacją.

    Co byś wybrał?

    --
    Maciej Sobczak * www.msobczak.com * www.inspirel.com

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: