मेरे पास नेटी ऐप है, जहां मैं एक चैनल में एक से अधिक धागे लिखना चाहता हूं। मैं बस सोच रहा था कि चैनल। लिखित थ्रेड सुरक्षित है या नहीं?नेटी चैनल .write धागा सुरक्षित है?
उत्तर
यह धागा सुरक्षित है इसलिए आपको चिंता करने की आवश्यकता नहीं है।
नहीं, यह थ्रेड-असुरक्षित है, क्योंकि Channel.write
ChannelOutboundBuffer.addMessage
को इसकी पाइपलाइन के हेडकॉन्टेक्स्ट में कॉल करता है, और ChannelOutboundBuffer.addMessage
निश्चित रूप से थ्रेड-असुरक्षित है।
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);
}
तो आपके पास किसी भी समय चैनल.write को कॉल करने वाले सबसे थ्रेड पर होना चाहिए। कोड के प्रारूप में कुछ गड़बड़ है, आप इसे http://netty.io/4.0/xref/index.html – yuguoliang
पर पा सकते हैं, मैं आपके दावे की पुष्टि करने में सक्षम नहीं हूं। मैं देखता हूं कि 'सारChannel.write' कॉल' Pipeline.write', जो अंततः उस चैनल के लिए ईवेंट लूप प्राप्त करने के बाद 'AbstractUnsafe.write' को कॉल करता है। इस विधि के अंदर एक जोर है कि थ्रेड इवेंट लूप के अंदर है, इसलिए इसे केवल एक समय में 1 थ्रेड द्वारा ही बुलाया जा सकता है – Ferrybig
आप कोड से देख सकते हैं, ChannelOutboundBuffer.addMessage()
विधि ही सुरक्षित थ्रेड नहीं है: इस कोड पर एक नज़र डालें। हालांकि, लेखन चैनल "थ्रेड सुरक्षित" है क्योंकि नेटटी एकल I/O थ्रेड में लेखन कार्य/विधि निष्पादित करता है।
http://stackoverflow.com/a/10702210/828625 –
मुझे नहीं पता, मैं गलत हो सकता हूं। लेकिन यह http://lists.jboss.org/pipermail/netty-users/2008-November/000045.html आपके द्वारा उद्धृत धागे में टिप्पणियों का विरोध करता प्रतीत होता है। –
फिर, जो आपने लिंक किया है वही बात कहता है, और आपके प्रश्न का उत्तर देता है। Channel.write थ्रेड-सुरक्षित है। –