2013-06-06 20 views
5

मैं वर्तमान में जावा की सुरक्षा तंत्र के साथ बहुत प्रयोग कर रहा हूं ताकि यह समझ सके कि सैंडबॉक्स में अविश्वसनीय कोड को सर्वोत्तम तरीके से कैसे निष्पादित किया जाए। जिन चीजों के खिलाफ आप रक्षा करना चाहते हैं उनमें से एक अनंत लूप हैं, यही कारण है कि आदर्श रूप से आप अविश्वसनीय कोड को अपने धागे में चलाना चाहते हैं। अब, ज़ाहिर है, दुर्भावनापूर्ण कोड, उदाहरण के लिए, कुछ भारी प्रसंस्करण कर सकता है जिसके परिणामस्वरूप लटकते धागे होते हैं। इस थ्रेड से छुटकारा पाने के लिए अनिवार्य रूप से जावा का बहिष्कृत थ्रेड.स्टॉप() तंत्र का उपयोग करना एकमात्र तरीका है। मुख्य कारण यह समस्याग्रस्त है कि धागे द्वारा आयोजित सभी ताले जारी किए जाते हैं जिसके परिणामस्वरूप भ्रष्ट वस्तुएं हो सकती हैं।जावा: लॉक के अधिग्रहण की निगरानी करें

सवाल यह है: जावा के सुरक्षा प्रबंधक और कस्टम क्लासलोडर के साथ मैं ट्रैक करने में सक्षम हूं, उदाहरण के लिए, कौन से वर्ग लोड किए जा सकते हैं और सिस्टम संसाधनों का उपयोग कैसे किया जा सकता है। ताले प्राप्त करने से कोड (और संभावित रूप से प्रतिबंधित) कोड होने का कोई तरीका है (उदाहरण के लिए, वर्तमान थ्रेड सिंक्रनाइज़ ब्लॉक में जाने से पहले सूचित किया गया कॉलबैक परिभाषित करना)।

उत्तर

4

यदि आप पहले से ही एक कस्टम क्लासलोडर का उपयोग कर रहे हैं, तो आप इसे लोड करने से पहले प्रत्येक वर्ग के बाइटकोड का निरीक्षण कर सकते हैं और एक लॉक (monitorenter) पकड़ने वाले निर्देश में इसका पता लगा सकते हैं।

आपको यह भी मानना ​​चाहिए कि स्टॉप() के साथ जारी किए गए ताले केवल एक समस्या है यदि वे साझा ऑब्जेक्ट्स पर अधिग्रहित होते हैं जो अन्य कोड संभावित रूप से लॉक हो सकता है। यदि आप "बुराई" धागे में पहुंचने के लिए ऐसी वस्तुओं से बच सकते हैं, तो आप सुरक्षित हैं।

+0

सच है, हालांकि आदर्श रूप से मैं कक्षाओं को त्यागना नहीं चाहता क्योंकि वे संभावित रूप से ताले हासिल करते हैं। लोडबैक को लोड और डालने के दौरान मैं निश्चित रूप से बाइटकोड बदल सकता हूं सिवाय इसके कि यह जावा में किसी भी वर्ग के लिए काम नहीं करता है। *। क्या monitorenter केवल बाइटकोड निर्देश है जो वीएम को लॉक पकड़ने के लिए कहता है? –

+0

हां, हालांकि, मोनिटोरेंटर केवल सिंक्रनाइज़ किए गए ब्लॉक संकलित करते समय उत्सर्जित होता है, जबकि सिंक्रनाइज़ किए गए तरीकों को कॉल करते समय लॉक अधिग्रहण अंतर्निहित होता है। तो आपको सिंक्रनाइज़ विधियों के साथ साझा ऑब्जेक्ट तक पहुंच प्राप्त करने के लिए थ्रेड को भी रोकना होगा। यदि कोड जावा में है। *, हालांकि, आपको यह मानना ​​चाहिए कि यह बुरा नहीं है :) –

+0

जावा में कोड। * बुरा नहीं है। हालांकि, अगर जावा से एक ऑब्जेक्ट * उदाहरण के लिए java.concurrent से एक कतार साझा किया जाता है तो ताला जावा के भीतर से अधिग्रहण किया जाता है। * हालांकि ऑब्जेक्ट को बाहर से उपयोग किया जाता है। –

संबंधित मुद्दे