ما هي الفئة غير الآمنة؟
تم تصميم Java في الأصل كبيئة آمنة تسيطر عليها. على الرغم من ذلك ، لا تزال نقطة Hotspot Java تتضمن "الباب الخلفي" الذي يوفر بعض العمليات ذات المستوى المنخفض والتي يمكنها معالجة الذاكرة والمواضيع مباشرة. يتم استخدام هذه الفئة الخلفية - sun.misc.unsafe - على نطاق واسع في حزمها الخاصة من قبل JDK ، مثل java.nio و java.util.concurrent. ومع ذلك ، لا ينصح هذا الباب الخلفي في بيئات الإنتاج على الإطلاق. لأن واجهة برمجة التطبيقات هذه غير آمنة للغاية ، وليست خفيفة ، وغير مستقرة. توفر هذه الفئة غير الآمنة رؤية للهيكل الداخلي للنقطة الساخنة JVM ويمكن تعديلها. في بعض الأحيان يمكن استخدامه لتعلم الهيكل الداخلي للجهاز الظاهري بدون تصحيح الأخطاء C ++ ، وأحيانًا يمكن استخدامه كأدوات مراقبة وتطوير الأداء.
مقدمة
في الآونة الأخيرة ، كنت أبحث في الكود المصدري لحزم Java المتزامنة واكتشفت الفئة السحرية غير الآمنة. لقد درستها بعناية وشاركتها معك هنا.
تقع الفئة غير الآمنة تحت حزمة Sun.Misc ولا تنتمي إلى معيار Java. ومع ذلك ، يتم تطوير العديد من مكتبات فئة Java الأساسية ، بما في ذلك بعض مكتبات التطوير عالية الأداء المستخدمة على نطاق واسع ، استنادًا إلى فئة غير آمنة ، مثل Netty و Cassandra و Hadoop و Kafka ، إلخ. تلعب الفئة غير الآمنة دورًا كبيرًا في تحسين كفاءة تشغيل Java وتعزيز قدرات التشغيل الكامنة في لغة Java.
يمنح الفئة غير الآمنة Java القدرة على تشغيل مساحة الذاكرة مثل المؤشرات بلغة C ، وكذلك تجلب مشاكل المؤشر. سيؤدي الاستخدام المفرط للفئة غير الآمنة إلى زيادة فرصة حدوث أخطاء ، لذلك لا تنصح Java باستخدامها ، ولا توجد وثائق رسمية تقريبًا. تخطط Oracle لإزالة الفئة غير الآمنة من Java 9 ، وإذا كان هذا هو الحال ، فسيكون ذلك كبيرًا جدًا.
عادة ما يكون من الأفضل عدم استخدام الفصل غير الآمن ما لم يكن له غرض واضح وله أيضًا فهم متعمق له. لاستخدام الفصل غير الآمن ، تحتاج إلى استخدام بعض الطرق الصعبة. يستخدم الفئة غير الآمنة نمط Singleton ويجب الحصول عليها من خلال طريقة ثابتة getUnsafe (). ومع ذلك ، فإن الطبقة غير الآمنة قد تقيدها. إذا كانت مكالمة عادية ، فسوف يلقي استثناء SecurityException ؛ يمكن للفئة التي تم تحميلها بواسطة محمل الفئة الرئيسي فقط استدعاء هذه الطريقة. رمز المصدر كما يلي:
static public unsafe getUnsafe () {class var0 = Reflection.getCallerClass () ؛ إذا (! } آخر {return theunsafe ؛ }}هناك أيضًا بعض الطرق لتحميل رمز المستخدم باستخدام محمل الفئة الرئيسية ، مثل تعيين معلمة BootClassPath. لكن الطريقة الأكثر بساطة هي استخدام انعكاس Java ، على النحو التالي:
الحقل f = unfafe.class.getDeclaredField ("TheUnsafe") ؛ F.SetAccessible (صحيح) ؛ غير آمن غير آمن = (غير آمن) f.get (null) ؛بعد الحصول على مثيل غير آمن ، يمكننا أن نفعل ما نريد. يوفر الفئة غير الآمنة الوظائف التالية:
1. إدارة الذاكرة. بما في ذلك تخصيص الذاكرة ، تحرير الذاكرة ، إلخ.
يتضمن هذا الجزء allocateMemory (altycateMemory) ، reallocatememory (reallocatememory) ، copymemory (ذاكرة النسخ) ، freememory (الذاكرة الحرة) ، getAddress (getget memory) ، advance ، advanize ، getint (الحصول على عدد صحيح يشير إلى عنوان الذاكرة) ، getIntvolatile الدلالات) ، putint (اكتب عدد صحيح إلى عنوان الذاكرة المحدد) ، putIntvolatile (اكتب عدد صحيح إلى عنوان الذاكرة المحدد ويدعم الدلالات المتطايرة) ، putorderedInt (اكتب عدد صحيح إلى عنوان الذاكرة المحدد ، الأساليب المطلوبة أو المتأخرة). Getxxx و putxxx تحتوي على أنواع أساسية مختلفة من العمليات.
باستخدام طريقة copymemory ، يمكننا تنفيذ طريقة نسخ كائن عامة دون تطبيق طريقة استنساخ لكل كائن. بالطبع ، يمكن لهذه الطريقة العامة تحقيق نسخ ضحل للكائن.
2.
توفر طريقة التخصيص () طريقة أخرى لإنشاء مثيل. عادةً ما يمكننا إنشاء مثيل للكائنات ذات الانعكاس الجديد أو الانعكاس. استخدم طريقة التخصيص () لإنشاء مثيلات الكائنات مباشرة دون استدعاء المنشئين وطرق التهيئة الأخرى.
يكون هذا مفيدًا عند إلغاء تمييز الكائنات ، مما يسمح بإعادة بناء الحقول النهائية ووضعها دون استدعاء المُنشئين.
3. فئات العملية ، الكائنات ، والمتغيرات.
يتضمن هذا الجزء staticfieldoffset (إزاحة المجال الثابت) ، defereeclass (فئة التعريف) ، interneanonymousclass (التعريف المجهول الفئة) ، insureclassinitialized (ضمان تهيئة الفئة) ، كوكبفيلدوفت (إزاحة مجال الكائن) وطرق أخرى.
من خلال هذه الطرق ، يمكننا الحصول على مؤشر الكائن. من خلال تعويض المؤشر ، لا يمكننا فقط تعديل البيانات التي يشير إليها المؤشر (حتى لو كانت خاصة) ، ولكن يمكننا حتى العثور على كائنات نظرت JVM بالفعل في القمامة ويمكن إعادة تدويرها.
4. عملية الصفيف.
يتضمن هذا الجزء ArrayBaseOffset (يحصل على عنوان الإزاحة للعنصر الأول من الصفيف) ، و ArrayIndexScale (يحصل على عنوان الزيادة للعنصر في المصفوفة) ، وما إلى ذلك. يتم استخدام ArrayBaseOffset بالتزامن مع ArrayIndexScale ، ويمكنك تحديد موقع كل عنصر في المصفوفة في الذاكرة.
نظرًا لأن قيمة الصفيف القصوى لـ Java هي integer.max_value ، يمكن استخدام طريقة تخصيص الذاكرة للفئة غير الآمنة لتنفيذ صفائف كبيرة فائقة. في الواقع ، يمكن اعتبار هذه البيانات مجموعة C ، لذلك تحتاج إلى الانتباه إلى تحرير الذاكرة في الوقت المناسب.
5. التزامن متعدد الخيوط. بما في ذلك آلية القفل ، عملية CAS ، إلخ.
يتضمن هذا الجزء مراقبة ، TryMonitorenter ، Monitorexit ، CompareAndswapint ، CompareAndswap وطرق أخرى.
من بينها ، تم وضع علامة على مراقبة و trymonitorenter و monitorexit على أنها مستهلكة ولا ينصح بها.
يمكن استخدام تشغيل CAS للفئة غير الآمنة أكثر من غيرها ، ويوفر حلاً جديدًا لآلية قفل Java. على سبيل المثال ، يتم تنفيذ AtomicInteger وغيرها من الفئات من خلال هذه الطريقة. طريقة المقارنة الذرية ، والتي يمكن أن تتجنب آليات القفل الثقيلة وتحسين كفاءة الكود. هذا قفل متفائل ، يُعتقد عادة أنه في معظم الحالات لا يوجد حالة سباق ، وإذا فشلت العملية ، فستستمر في المحاولة مرة أخرى حتى تنجح.
6. تعليق واستعادة.
يشمل هذا الجزء الحديقة ، غير المميزة وطرق أخرى.
تعليق موضوع من خلال طريقة الحديقة. بعد استدعاء الحديقة ، سيتم حظر الخيط حتى تحدث المهلة أو المقاطعة. يمكن لـ UNPARK إنهاء موضوع معلق لاستعادته إلى طبيعته. يتم تغليف عملية التعليق على المواضيع في إطار التزامن بأكمله في فئة LockSupport. هناك العديد من الإصدارات من طرق الحزمة في فئة Locksupport ، ولكن في النهاية ، تسمى طريقة غير آمنة. park ().
7. حاجز الذاكرة.
يتضمن هذا الجزء loadfence ، storefence ، fullfence وطرق أخرى. يتم تقديم هذا حديثًا في Java 8 لتحديد حواجز الذاكرة لتجنب إعادة ترتيب الكود.
LoadFence () يعني أن جميع عمليات التحميل قبل الانتهاء من الطريقة قبل حاجز الذاكرة. وبالمثل ، يعني Storefence () أن جميع عمليات المتجر قبل اكتمال هذه الطريقة قبل حاجز الذاكرة. fullfence () يعني أن جميع عمليات التحميل والتخزين قبل الانتهاء من الطريقة قبل حاجز الذاكرة.
لخص
ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يكون لمحتوى هذه المقالة قيمة مرجعية معينة لدراسة أو عمل الجميع. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل. شكرا لك على دعمك إلى wulin.com.