मैं निम्नलिखित जावा कोड है:डेडलॉक और अधिग्रहण (int)
import java.util.concurrent.*;
class Foo{
static Semaphore s = new Semaphore(1);
public void fun(final char c, final int r){
new Thread(new Runnable(){
public void run(){
try{
s.acquire(r);
System.out.println(c+"_"+r);
s.release(r+1);
} catch(Exception e){ e.printStackTrace(); }
}
}).start();
}
}
class ths{
public static void main(String[]args) throws Exception{
Foo f = new Foo();
f.fun('B',2);
f.fun('F',6);
f.fun('A',1);
f.fun('C',3);
f.fun('D',4);
f.fun('E',5);
}
}
आदर्श रूप में, इस आदेश और बाहर निकलने में F_6 के माध्यम से A_1 प्रिंट चाहिए, लेकिन किसी कारण से नहीं होता है कि । यह आमतौर पर ए_1 और बी 2 प्रिंट करता है और फिर यह अटक जाता है।
मुझे अपने कोड के साथ कुछ भी गलत नहीं मिल रहा है। कोई सुझाव?
यह ठीक करता है, लेकिन मुझे आश्चर्य है कि यह क्यों जरूरी है। यदि यह B_2 प्रिंट करने के बाद फंस गया है, और मुख्य थ्रेड में, कुछ समय बाद, मैं उपलब्ध परमिट की संख्या मुद्रित करता हूं, यह प्रिंट करता है 3. तो थ्रेड सी को जारी रखने की अनुमति क्यों नहीं है? – Vlad
@Vlad: मेरा अनुमान है कि '3' इस तथ्य को प्रतिबिंबित नहीं करता है कि' डी' पहले से ही "अधिग्रहण (4) 'कॉल के लिए कुछ परमिट" आरक्षित "हो सकता है। – NPE
मुझे लगता है कि आप सही हो सकते हैं। मैंने रिलीज के लिए पर्याप्त रूप से पर्याप्त दस्तावेज नहीं पढ़ा था। [कड़ी] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent/Semaphore.html#release (int))। मैंने माना था कि कार्यान्वयन थ्रेड पर चक्र होगा और वास्तव में जागने वाले व्यक्ति को खोजने का प्रयास करेगा। – Vlad