में समझौता विदेशी तरीकों मैं जे बलोच के प्रभावी जावा पढ़ रहा हूँ और अब मैं विदेशी तरीकों के बारे में खंड पर हूँ।जावा संगामिति
मैं जावा संगामिति और नुकसान वे कर सकता है में विदेशी तरीकों को समझने के लिए कोशिश कर रहा हूँ। जैसा कि उन्होंने कहा, हम मूल रूप से नहीं जानते कि विदेशी तरीके क्या कर सकती हैं और हम डेडलॉकिंग समाप्त कर सकते हैं। मैं इस तरह के एक deadlocking व्यवहार निम्नलिखित सरल अनुप्रयोग लिख पुन: पेश करने की कोशिश की (विदेशी विधि सादगी के लिए एक ही कक्षा में है):
public class App {
private static StringBuffer lines = new StringBuffer();
public static void modifyLines(){
System.out.println("Invocation modifyLines() started by " + Thread.currentThread().getName());
synchronized (lines) {
System.out.println("Entering modifyLines() synchronized " + Thread.currentThread().getName());
lines.append("Modified");
}
}
public static void main(String[] args) throws InterruptedException {
synchronized (lines) {
System.out.println("Entering main() synchronized by " + Thread.currentThread().getName());
alienMethod();
}
}
public static void alienMethod(){
ExecutorService es = Executors.newSingleThreadExecutor();
es.submit(new Runnable() {
@Override
public void run() {
modifyLines();
}
});
es.shutdown();
}
}
मैं एक गतिरोध की उम्मीद जगह लेने के लिए और है कि धागा alienMethod()
को फोन करके पैदा की होगा modifyLines()
के भीतर सिंक्रनाइज़ ब्लॉक कभी दर्ज न करें।
Entering main() synchronized by main
Invocation modifyLines() started by pool-1-thread-1
Entering modifyLines() synchronized pool-1-thread-1
गतिरोध नहीं हुआ इसका मतलब है: लेकिन कार्यक्रम निम्नलिखित प्रिंट करता है। क्यूं कर? विदेशी विधि उदाहरण के साथ क्या गलत है?
विषय प्रभावी जावा, 2 एड में संगामिति के बारे में आइटम नहीं है। ब्रायन गोएट्ज़ द्वारा "अभ्यास में जावा कंसुरेंसी इन प्रैक्टिस" में अधिक व्यापक रूप से शामिल हैं। – scottb