का सिंक्रनाइज़ेशन मैं डॉग ली के 'जावा में कंसुरेंसी प्रोग्रामिंग' पुस्तक पर पढ़ रहा हूं। जैसा कि आप जानते हैं, डौग ने मूल रूप से जावा कंसुरेंसी एपीआई लिखा था। हालांकि, कुछ ने मुझे कुछ भ्रम पैदा कर दिया है और मैं इस छोटे से conundrum पर मेरी कुछ राय हासिल करने की उम्मीद कर रहा था!एक कतार
class LinkedQueue {
protected Node head = new Node(null);
protected Node last = head;
protected final Object pollLock = new Object();
protected final Object putLock = new Object();
public void put(Object x) {
Node node = new Node(x);
synchronized (putLock) { // insert at end of list
synchronized (last) {
last.next = node; // extend list
last = node;
}
}
}
public Object poll() { // returns null if empty
synchronized (pollLock) {
synchronized (head) {
Object x = null;
Node first = head.next; // get to first real node
if (first != null) {
x = first.object;
first.object = null; // forget old object
head = first; // first becomes new head
}
return x;
}
}
}
static class Node { // local node class for queue
Object object;
Node next = null;
Node(Object x) { object = x; }
}
}
यह एक काफी अच्छा कतार डौग ली की कतार उदाहरण से निम्नलिखित कोड ले लो ...। यह दो मॉनीटर का उपयोग करता है ताकि एक निर्माता और उपभोक्ता एक ही समय में कतार तक पहुंच सके। अच्छा! हालांकि, 'आखिरी' और 'सिर' पर सिंक्रनाइज़ेशन मुझे यहां भ्रमित कर रहा है। पुस्तक बताती है कि इस स्थिति के लिए इसकी आवश्यकता है जिसके द्वारा कतार वर्तमान में है या 0 प्रविष्टियां हैं। ठीक है, काफी उचित है और इस तरह की समझ में आता है।
हालांकि, मैंने जावा कंसुरेंसी लिंक्डब्लॉकिंगक्यूयू को देखा। कतार के original संस्करण सिर या पूंछ पर सिंक्रनाइज़ नहीं करते हैं (मैं भी आधुनिक संस्करण के लिए एक और लिंक पोस्ट करना चाहता था जो एक ही समस्या से पीड़ित है लेकिन मैं ऐसा नहीं कर सका क्योंकि मैं नौसिखिया हूं)। मुझे आश्चर्य है क्यों नहीं? क्या मुझसे कोई चूक हो रही है? क्या जावा मेमोरी मॉडल की मूर्खतापूर्ण प्रकृति का कुछ हिस्सा है जो मुझे याद आ रहा है? मैंने दृश्यता उद्देश्यों के लिए सोचा होगा कि इस सिंक्रनाइज़ेशन की आवश्यकता है? मैं कुछ विशेषज्ञ राय की सराहना करता हूं!
कृपया ध्यान दें, मेरा वर्तमान सिद्धांत 'टेकलॉक' के लिए सिंक्रनाइज़ किए गए ब्लॉक में 'सिग्नल नॉटएक्टी' विधि के बारे में रहता है। यह शायद 'सिर' को देखने के लिए मजबूर करेगा। –