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?
Odpowiedz
Jest bezpieczny dla wątków, więc nie musisz się martwić.
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);
}
, 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
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
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.
- 1. Czy bezpieczny wątek SecureRandom jest bezpieczny?
- 2. Czy wątek console.writeline jest bezpieczny?
- 3. Czy wątek Joiner jest bezpieczny?
- 4. Czy wątek libuv jest bezpieczny?
- 5. Czy wątek RNGCryptoServiceProvider.GetBytes jest bezpieczny?
- 6. Czy wątek NSFileManager jest bezpieczny?
- 7. Czy C# "??" Czy wątek operatora jest bezpieczny?
- 8. Czy wątek java.util.Calendar jest bezpieczny czy nie?
- 9. jest bezpieczny wątek DatagramSocket.send?
- 10. Czy bezpieczny wątek String.intern()
- 11. Czy ten wątek klasy Java jest bezpieczny?
- 12. Czy wątek jest bezpieczny dla wątków SLF4J?
- 13. Czy wątek TelemetryClient Application Insight jest bezpieczny?
- 14. Czy wątek protobuf-net jest bezpieczny?
- 15. Delphi - czy wątek TClientDataset jest bezpieczny?
- 16. Czy wątek TADOConnection Delphi jest bezpieczny?
- 17. .NET - Czy wątek metody Queue.Enqueue jest bezpieczny?
- 18. Czy wątek armadillo solve() jest bezpieczny?
- 19. Czy ten wątek pomocniczy html jest bezpieczny?
- 20. Czy ten wątek użycia blokady jest bezpieczny?
- 21. Czy wątek CertificateFactory.getInstance ("x.509") jest bezpieczny?
- 22. Czy wątek trojański (? :) wątek jest bezpieczny w C#?
- 23. HtmlUnit: jeden WebClient na wątek - czy wątek jest bezpieczny?
- 24. BroadcastReceiver onReceive() wątek bezpieczny?
- 25. Wątek bezpieczny stos C++
- 26. Bezpieczny wątek unique_ptr move
- 27. java.text.SimpleDateFormat nie wątek bezpieczny
- 28. W SignalR jest Hub.Context wątek bezpieczny?
- 29. Czy program Win32 rejestruje wątek bezpieczny?
- 30. Czy wątek TransactionTemplate i SimpleJdbcTemplate jest bezpieczny dla wątków?
http://stackoverflow.com/a/10702210/828625 –
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. –
Ponownie, to, co łączysz, mówi to samo i odpowiada na twoje pytanie. Channel.write jest wątkowo bezpieczny. –