स्कैला में, AnyRef पर एक सिंक्रनाइज़ विधि है जो आपको AnyRef को विस्तारित करने वाली किसी ऑब्जेक्ट पर सिंक्रनाइज़ करने देती है। हालांकि, यह AnyRef पर सार है, और मैं यह नहीं समझ पाया कि यह स्केल स्रोत को पकड़ने से कैसे काम करता है। ऐसा लगता है कि यह जावा में सिंक्रनाइज़ किए गए कीवर्ड का शोषण करके काम करता है। क्या यह मामला है?AnyRef पर सिंक्रनाइज़ विधि कैसे कार्यान्वित की जाती है?
उत्तर
1) AnyRef.synchronized
एक जादू विधि है जो स्रोत कोड में मौजूद नहीं है, लेकिन संकलक के प्रत्येक स्टार्टअप पर कंपाइलर की प्रतीक तालिका में इंजेक्शन दिया जाता है: Definitions.scala। रास्ते में (Definitions.scala) कई जादू विधियों और कक्षाएं हैं।
2) एक विधि this.synchronized
में लपेटा जाता है, तो रैपिंग गिरा दिया जाता है, और विधि आंतरिक रूप से एक SYNCHRONIZED
ध्वज (UnCurry.scala) है, जो तब JVM के `ACC_SYNCHRONIZED विधि का उपयोग झंडा (GenASM.scala) करने के लिए मैप किया गया है के साथ टिप्पणी की जाती है।
3) synchronized
को अन्य कॉल पर मैप की जाती हैं बैकएंड के आदिम SYNCHRONIZED
(backend/ScalaPrimitives.scala) है, जो बाद में monitorenter/monitorexit (GenICode.scala #1, GenICode.scala #2) में उतारा गया है।
यूजीन से जवाब में जोड़ने के लिए, जो दिल से कंपाइलर को जानता है, यहां एक छोटा सा स्केल कंसोल सत्र है।
निचली पंक्ति: जेनरेट कोड बिल्कुल जावा जैसा होगा जो आप प्राप्त करेंगे। सिंक्रनाइज़ {...} और यहां तक कि एक विधि कॉल के लिए उत्पन्न कोई बंद नहीं है। बस कोशिश करें/पकड़ो जहां कोशिश की शुरुआत में एक monitorenter बाइटकोड (3) है और दोनों सामान्य निकास (9) में कैच निकास (12) में एक monitorexit है। इसलिए जावा में इसका उपयोग कर स्कैला बनाम सिंक्रनाइज़ किए गए उपयोग में कोई ओवरहेड शामिल नहीं है।
ध्यान दें कि ज्यादातर लोग मानते हैं कि प्रत्येक वस्तु पर खतरनाक निम्न स्तर के थ्रेड सिंक्रनाइज़ेशन संरचनाओं को आम तौर पर एक बुरा विचार माना जाता है जो केवल जावा संगतता के लिए किया जाता था।
scala> class Test { def test { this.synchronized { } } }
defined class Test
scala> :javap -c Test
Compiled from "<console>"
public class Test extends java.lang.Object implements scala.ScalaObject{
public void test();
Code:
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: getstatic #12; //Field scala/runtime/BoxedUnit.UNIT:Lscala/runtime/BoxedUnit;
7: pop
8: aload_1
9: monitorexit
10: return
11: aload_1
12: monitorexit
13: athrow
Exception table:
from to target type
4 10 11 any
- 1. http पोस्ट विधि कैसे कार्यान्वित की जाती है?
- 2. सी स्तर पर PHP सरणी कैसे कार्यान्वित की जाती है?
- 3. सिंक्रनाइज़ किया गया है संग्रह की toArray() विधि सिंक्रनाइज़?
- 4. कन्वर्टबैक विधि कब कॉल की जाती है?
- 5. ओएस स्तर पर नींद कैसे लागू की जाती है?
- 6. फेसबुक चैट विंडो कैसे कार्यान्वित की जाती हैं?
- 7. ListView की getView() विधि कब कॉल की जाती है?
- 8. एप्लिकेशन की ऑनक्रेट() विधि कब कॉल की जाती है?
- 9. जावा सिंक्रनाइज़ विधि
- 10. NSUserDefaults सिंक्रनाइज़-विधि
- 11. "सार्वजनिक/संरक्षित/निजी" विधि कैसे कार्यान्वित की जाती है, और मैं इसे कैसे अनुकरण कर सकता हूं?
- 12. NSObject में कार्यान्वित गिनती कैसे बनाए रखी जाती है?
- 13. क्या सिंक्रनाइज़ (यह) और सिंक्रनाइज़ विधि के बीच अंतर है
- 14. घाटे की गणना कैसे की जाती है?
- 15. जावा ताले: सिंक्रनाइज़ ब्लॉक में मॉनिटर ताले के लिए समानता जांच कैसे की जाती है?
- 16. एक धागा है कि सिंक्रनाइज़ क्रियान्वित विधि
- 17. नोटिफ़िकॉन की गारंटी कैसे दी जाती है?
- 18. सर्वलेट इनिट विधि जिसमें सिंक्रनाइज़ ब्लॉक है
- 19. क्या ऑन अपग्रेड विधि कभी कॉल की जाती है?
- 20. आईफोन - एक बहिष्कृत विधि आमतौर पर अप्रचलित हो जाती है?
- 21. सीयूडीए मेमोरी कैसे प्रबंधित की जाती है?
- 22. स्थिर विधि सिंक्रनाइज़ करना या
- 23. moq: सेटअप() का उपयोग करते समय, विधि पैरामीटर की समानता कैसे निर्धारित की जाती है?
- 24. निर्भरता संपत्ति कैसे लागू की जाती है?
- 25. neo4j दृढ़ता कैसे लागू की जाती है?
- 26. कोड मेमोरी कैसे प्रबंधित की जाती है?
- 27. थ्रेडलोकल पर संचालन सिंक्रनाइज़ किया जाना है?
- 28. GetBBox() SVGRect की गणना कैसे की जाती है?
- 29. अनुसूचित कार्य सीमाएं (या कार्य निरंतरता कैसे कार्यान्वित की जाती है)?
- 30. स्थिर विधि पर सिंक्रनाइज़ किए गए क्या करते हैं?