2012-06-19 12 views
5

Mam aplikację Netty, w której chcę mieć więcej niż jeden wątek do zapisu na kanale. Właśnie zastanawiałem się czy Channel.write jest wątkiem bezpiecznym?Czy wątek Netty Channel.write jest bezpieczny?

+0

http://stackoverflow.com/a/10702210/828625 –

+0

Nie wiem, może się mylę. Ale ten http://lists.jboss.org/pipermail/netty-users/2008-November/000045.html wydaje się być sprzeczny z uwagami w cytowanym przez ciebie wątku. –

+1

Ponownie, to, co łączysz, mówi to samo i odpowiada na twoje pytanie. Channel.write jest wątkowo bezpieczny. –

Odpowiedz

2

Jest bezpieczny dla wątków, więc nie musisz się martwić.

0

Nie, jest niebezpieczny dla wątków, ponieważ Channel.write wywołuje ChannelOutboundBuffer.addMessage w swoim HeadContext w jego potoku, a ChannelOutboundBuffer.addMessage jest zdecydowanie wątkowo niebezpieczny. Spojrzeć na ten kod:

public void addMessage(Object msg, int size, ChannelPromise promise) { 
    Entry entry = Entry.newInstance(msg, size, total(msg), promise); 
    if (tailEntry == null) { 
     flushedEntry = null; 
     tailEntry = entry; 
    } else { 
     Entry tail = tailEntry; 
     tail.next = entry; 
     tailEntry = entry; 
    } 
    if (unflushedEntry == null) { 
     unflushedEntry = entry; 
    } 

    // increment pending bytes after adding message to the unflushed arrays. 
    // See https://github.com/netty/netty/issues/1619 
    incrementPendingOutboundBytes(size, false); 
} 
+1

, więc powinieneś mieć najwyżej jeden wątek wywołujący Channel.write w dowolnym momencie. coś jest nie tak z formatem kodu, możesz go znaleźć na http://netty.io/4.0/xref/index.html – yuguoliang

+0

Nie mogę potwierdzić Twojego roszczenia. Widzę, że 'AbstractChannel.write' wywołuje' Pipeline.write', który ostatecznie wywołuje 'AbstractUnsafe.write', po tym, jak uzyskał pętlę zdarzeń dla tego kanału. Wewnątrz tej metody znajduje się potwierdzenie, że wątek znajduje się wewnątrz pętli zdarzeń, więc można go wywoływać tylko przez 1 wątek na raz – Ferrybig

3

Jak widać z kodu, sama metoda ChannelOutboundBuffer.addMessage() nie jest bezpieczeństwo wątków. Jednak kanał zapisu jest "bezpieczny dla wątków", ponieważ netty wykonuje zadanie/metodę zapisu w pojedynczym wątku we/wy.

Powiązane problemy