जेएमएम से संबंधित प्रश्न और सिंक्रनाइज़ किए गए ब्लॉक में लिखे गए अस्थिर फ़ील्ड से संबंधित अर्थशास्त्र, लेकिन अन-सिंक्रनाइज़ेशन पढ़ें।अस्थिर सरणी की आवश्यकता सिंक्रनाइज़ ब्लॉक
नीचे दिए गए कोड के प्रारंभिक संस्करण में, मैं एक्सेस को सिंक्रनाइज़ नहीं कर रहा था क्योंकि यह पहले की आवश्यकताओं के लिए अनावश्यक था (और एक स्वयं असाइनमेंट का दुरुपयोग इस.cache = this.cache अस्थिर लेखन अर्थशास्त्र सुनिश्चित करता है)। कुछ आवश्यकताएं बदल गई हैं, यह सुनिश्चित करने के लिए सिंक्रनाइज़ेशन की आवश्यकता है कि डुप्लिकेट अपडेट नहीं भेजे गए हैं। मेरे पास सवाल यह है कि सिंक्रनाइज़ेशन ब्लॉक अस्थिर क्षेत्र के स्वयं असाइनमेंट की आवश्यकता को रोकता है?
// Cache of byte[] data by row and column.
private volatile byte[][][] cache;
public byte[] getData(int row, int col)
{
return cache[row][col];
}
public void updateData(int row, int col, byte[] data)
{
synchronized(cache)
{
if (!Arrays.equals(data,cache[row][col]))
{
cache[row][col] = data;
// Volatile write.
// The below line is intentional to ensure a volatile write is
// made to the array, since access via getData is unsynchronized.
this.cache = this.cache;
// Notification code removed
// (mentioning it since it is the reason for synchronizing).
}
}
}
तुल्यकालन के बिना, मुझे विश्वास है कि स्वयं काम अस्थिर लिखने तकनीकी रूप से आवश्यक है (कोई प्रभाव नहीं होने के रूप में हालांकि आईडीई झंडे यह)। सिंक्रनाइज़ ब्लॉक के साथ, मुझे लगता है कि यह अभी भी जरूरी है (क्योंकि पढ़ना अनसंक्रनाइज़ किया गया है), लेकिन मैं सिर्फ पुष्टि करना चाहता हूं क्योंकि कोड में हास्यास्पद लगता है अगर यह वास्तव में आवश्यक नहीं है। मुझे यकीन नहीं है कि क्या कोई गारंटी है कि मुझे सिंक्रनाइज़ किए गए ब्लॉक के अंत और अस्थिर पढ़ने के बारे में अनजान है।
उत्तर के लिए धन्यवाद, यह स्पष्ट है और मुझे संदेह है कि मुझे क्या संदेह है। दो कैश वैरिएबल होने से संबंधित सलाह शायद एक अच्छा विचार भी है क्योंकि इससे कोई व्यक्ति स्वयं असाइनमेंट को हटा देता है (टिप्पणियों की चेतावनी के बावजूद)। –