غير آمن هو حجر الزاوية في عملية Java بدون قفل ، وهي لا غنى عنها في فصول التزامن الخالية من القفل. على سبيل المثال ، يتم تنفيذ ConcurrenthashMap و ConcurrentLinkedqueue من قبل الفئة غير الآمنة. بالمقارنة مع الأقفال في Java ، لا يوجد في الأساس عدم الحمل وسوف تنتظر في مكانها. تقدم هذه المقالة بشكل أساسي العمليات الرئيسية في غير آمنة.
1 المقارنة
/*** قارن القيمة في موقع الذاكرة عند إزاحة OBJ والقيمة المتوقعة ، وتحديثها إذا كانت كذلك. هذا التحديث غير قابل للمقاطعة. *. تحديث)؛
هذه هي عملية CAS الشهيرة ، والتي تنقسم إلى ثلاث خطوات
تتضمن عائلة CAS أيضًا مقارنات ConpertSwapObject () ، و CompareAndswaplong () ، و CompareAndSwapint () ، وما إلى ذلك.
استخدم مثالًا كلاسيكيًا من AtomicInteger لتوضيح:
Public Final int getandadd (int delta) {return unfafe.getandaddint (this ، valueffset ، delta) ؛} // unfafe.getandaddintpublic final getandaddint (Object var1 ، long var2 ، int var4) {int var5 ؛ do { / ** احصل على القيمة الأصلية* / var5 = this.getIntVolatile (var1 ، var2) ؛ / ** تأكد من أن القيمة الأصلية لم يتم تعديلها بواسطة مؤشرات الترابط الأخرى ، ثم قم بتنفيذ عملية التحديث Var5 + Var4*/} بينما (! this.compareanswapint (var1 ، var2 ، var5 ، var5 + var4)) ؛ إرجاع var5 ؛}2 putorder
/**** يعين قيمة حقل عدد صحيح في الإزاحة المحددة في الكائن المرفق* إلى القيمة المحددة. هذا إصدار مرتبة أو كسول من <code> putIntvolatile (كائن ، طويل ، int) </code> ، والذي لا يضمن الرؤية الفورية للتغيير إلى مؤشرات الترابط * الأخرى. إنه مفيد حقًا عندما يكون حقل عدد صحيح * <code> متقلبة </code> ، وبالتالي من المتوقع أن يتغير بشكل غير متوقع. * * param obj الكائن الذي يحتوي على الحقل لتعديل. * param إزاحة إزاحة حقل عدد صحيح داخل <code> obj </code>. * param قيمة القيمة الجديدة للحقل. * seee #putintvolatile (كائن ، طويل ، int) */ public public void putorderedInt (Object OBJ ، إزاحة طويلة ، قيمة int) ؛
قم بتعديل الموضع الذي يتم فيه تعويض إزاحة كائن OBJ إلى القيمة ، لأنه لا توجد عملية ذاكرة في Java ، وهذا التشغيل غير الآمن فقط يكمل عملية الذاكرة غير الكافية. يمكن أيضًا استخدامه لعمليات الصفيف ، مثل ConcurrentHashMap لعدد كبير من الاستخدام
الجزء <k ، v> s0 = شريحة جديدة <k ، v> (loadFactor ، (int) (cap * loadFactor) ، (hashentry <k ، v> []) new hashentry [cap]) ؛ الجزء <k ، v> [] ss = (القطاع <k ، v> []) شريحة جديدة [ssize] ؛ // اكتب S0 إلى الموضع الذي يتم فيه رسم الصفيف إلى 0: SS [0] = S0 Unsafe.putOrdordEdObject (SS ، SBase ، S0) ؛ // طلب كتابة الأجزاء [0]
تجدر الإشارة إلى أنه يجب ضبط OBJ على متقلبة ، وإلا فإنه سيكون غير مرئي لخيوط أخرى.
3 putxxxvolatile
/**** يعين قيمة حقل عدد صحيح في الإزاحة المحددة في الكائن المرفق* إلى القيمة المحددة ، مع دلالات المتجر المتطايرة. * * param obj الكائن الذي يحتوي على الحقل لتعديل. * param إزاحة إزاحة حقل عدد صحيح داخل <code> obj </code>. * param قيمة القيمة الجديدة للحقل. */ Public void putIntvolatile (Object OBJ ، إزاحة طويلة ، قيمة int) ؛
إنه شعور مثل putorderint ، لأنه يجب ضبطه على متقلبة ، وإلا ما الفائدة؟
ما سبق هو كل نقاط المعرفة التي شاركتها معك هذه المرة. شكرا لك على دعمك إلى wulin.com.