مقدمة
توفر Java حزمة java.util.concurrent.atomic منذ JDK1.5 ، والتي تسهل المبرمجين إلى أداء العمليات الذرية دون أقفال في بيئة متعددة الخيوط. تستخدم الطبقة الأساسية للمتغيرات الذرية الإرشادات الذرية التي يوفرها المعالج ، ولكن قد توفر بنيات وحدة المعالجة المركزية المختلفة تعليمات ذرية مختلفة ، وقد تتطلب أيضًا شكلًا من أشكال القفل الداخلي ، لذلك لا يمكن لهذه الطريقة التأكد من عدم حظر الخيط.
مقدمة الحزمة الذرية
هناك 12 فئة في الحزمة الذرية ، وأربع طرق تحديث ذري هي: التحديث الذري الأنواع الأساسية ، ومصفوفات التحديث الذري ، ومراجع التحديث الذري وحقول التحديث الذري. الفصول في الحزمة الذرية هي الفئات ملفوفة بشكل أساسي باستخدام غير آمن.
فئة النوع الأساسي التحديث الذري
لتحديث الأنواع الأساسية من خلال الطرق الذرية ، توفر الحزمة الذرية الفئات الثلاثة التالية:
AtomicBoolean: التحديثات الذرية نوع منطقي.
Atomicinteger: عدد صحيح التحديث الذري.
Atomiclong: تحديث ذري طويل عدد صحيح.
الطرق الشائعة للذات هي كما يلي:
int addandget (int delta): يضيف قيمة الإدخال إلى القيمة في المثيل (القيمة في AtomicInteger) بطريقة ذرية وإرجاع النتيجة
Boolean CompareAndset (int توقع ، تحديث int): إذا كانت قيمة الإدخال مساوية للقيمة المتوقعة ، فقم بتعيين القيمة على قيمة الإدخال ذرية.
int getAndIncrement (): يضيف القيمة الحالية إلى 1 من الناحية الذرية. ملاحظة: القيمة التي تم إرجاعها هنا هي القيمة قبل التلقائي.
void lazyset (int newvalue): سيتم تعيينه في النهاية على NewValue. بعد استخدام LazySet لتعيين القيمة ، قد لا تزال مؤشرات الترابط الأخرى قادرة على قراءة القيمة القديمة int getAndet (int newValue): يتم ضبطها على قيمة newValue بطريقة ذرية وإرجاع القيمة القديمة.
رمز مثال AtomicInteger هو كما يلي:
استيراد java.util.concurrent.atomic.atomicinteger ؛ الطبقة العامة atomicintegertest {static atomicinteger ai = new Atomicinteger (1) ؛ public static void main (string [] args) {system.out.println (ai.getandincrement () ؛الإخراج
12
حلوى بعد العشاء
توفر الحزمة الذرية ثلاثة أنواع أساسية من التحديثات الذرية ، لكن أنواع Java الأساسية تشمل Char و Float و Double. إذن السؤال هو ، كيفية تحديث الأنواع الأساسية الأخرى من الذرات؟ يتم تنفيذ الفصول في الحزمة الذرية بشكل أساسي باستخدام غير آمن. دعونا نلقي نظرة على رمز المصدر لعدم الآمنة. لقد وجدنا أن Uncafe يوفر فقط ثلاث طرق CAS ، CompareAndSwapObject ، CompareAndswapint و ConteraIndswaplong. ثم انظر إلى رمز مصدر AtomicBoolean. لقد وجدنا أنه يقوم أولاً بتحويل Boolean إلى عدد صحيح ، ثم يستخدم CompareAndswapint لـ CAS ، لذلك يمكن أيضًا تنفيذ التحديث الذري المزدوج باستخدام أفكار مماثلة.
فئة صفيف التحديث الذري
توفر الحزمة الذرية الفصول الثلاثة التالية:
AtomicIntegerArray: تحديث العناصر الذرية في مجموعة عدد صحيح.
Atomiclongarray: تحديثات ذرية عناصر في المصفوفات الطويلة.
AtomicReferenceArray: تحديثات الذرية عناصر في صفيف النوع المرجعي.
توفر فئة AtomicIntegerArray بشكل رئيسي ذرية لتحديث الأعداد الصحيحة في الصفيف. الطرق الشائعة الاستخدام هي كما يلي
int addandget (int i ، int delta): يضيف قيمة الإدخال من الناحية الذرية إلى مؤشر العنصر I في الصفيف.
Boolean CompareAndset (int i ، int repication ، int update): إذا كانت القيمة الحالية مساوية للقيمة المتوقعة ، يتم تعيين العنصر في موضع الصفيف الأول على قيمة التحديث.
رمز المثال هو كما يلي:
الفئة العامة AtomicIntegerArrayTest {static int [] value = new int [] {1 ، 2} ؛ static atomicintegerarray ai = new AtomicIntegerArray (value) ؛ public static void main (string [] args) {ai.getandset (0 ، 3) ؛ system.out.println (ai.get (0)) ؛ system.out.println (value [0]) ؛}}الإخراج
31
ما تحتاج إلى ملاحظته في فئة AtomicIntegerArray هو أن قيمة الصفيف قد تم تمريرها من خلال طريقة المنشئ ، ومن ثم سوف يقوم AtomicIntegerarray بنسخ المصفوفة الحالية ، لذلك عندما يقوم AtomicIntegerarray بتعديل عناصر الصفيف الداخلي ، لن يؤثر ذلك على المصفوف الممر.
نوع مرجع التحديث الذري
يمكن لـ AtomicInteger ، وهو نوع أساسي ، تحديث متغير واحد فقط. إذا كنت ترغب في تحديث متغيرات متعددة من الناحية الذرية ، فأنت بحاجة إلى استخدام هذه الذرة لتحديث الفئة المقدمة من نوع المرجع. توفر الحزمة الذرية الفصول الثلاثة التالية:
AtomicReference: التحديثات الذرية النوع المرجعي.
AtomicReferenceFieldupdater: حقول التحديثات الذرية في النوع المرجعي.
AtomIcMarkablereference: التحديثات الذرية النوع المرجعي مع بتات العلامات. يمكنك تحديث بتة علامة نوع منطقية ونوع المرجع. طريقة البناء هي AtomIcMarkablereference (V initialRef ، المميزات المنطقية الأولية)
رمز استخدام AtomicReference كما يلي:
الفئة العامة AtomicReferEncetest {public static atomicReference <Seter> AtomicUserRef = new AtomIcReference </surse> <serve> () ؛ public static void main (String [] args) {user user = new user ("conan" ، 15) ؛ 17) ؛ AtomicUserRef.compareAndeAndeSet (user ، updateUser) ؛ system.out.println (AtomicUserRef.get (). Old ؛} السلسلة العامة getName () {return name ؛} public int getold () {return Old ؛}}}الإخراج
Shinichi17
فئة حقل التحديث الذري
إذا كنا بحاجة فقط إلى حقل معين في فئة معينة ، فنحن بحاجة إلى استخدام Atomic لتحديث فئة الحقل. توفر الحزمة الذرية الفصول الثلاثة التالية:
AtomicIntegerfieldupdater: محدث للحقول التي تحديث الأعداد الصحيحة ذرية.
Atomiclongfieldupdater: محدث للتحديثات الذرية الحقول العددية الطويلة.
AtomicStampedReference: التحديثات الذرية النوع المرجعي برقم إصدار. يربط هذا الفئة قيم عدد صحيح مع المراجع ويمكن استخدامها لمزيد من البيانات الذرية وأرقام الإصدار ، والتي يمكن أن تحل مشاكل ABA التي قد تنشأ عند استخدام CAS للتحديثات الذرية.
فئات حقل التحديث الذري هي فئات مجردة ، وفي كل مرة يتم استخدامها ، يجب عليهم استخدام الطريقة الثابتة NewUpdater لإنشاء محدث. يجب استخدام المعدل المتطاير العام لحقول فئة التحديث الذري.
الخطوة الأولى هي أنه نظرًا لأن فئات حقل التحديث الذرية هي فئات مجردة ، في كل مرة تستخدم فيها الطريقة الثابتة AtomicIntegerFieldupDater.newupdater ، يجب عليك إنشاء محدث ، وتحتاج إلى تعيين الفصول والخصائص التي تريد تحديثها. والخطوة الثانية هي تحديث الحقول (خصائص) الفئة يجب أن تستخدم المعدل المتقلبة العام (خاص تقلب int)
مثال رمز AtomicIntegerfieldupdater هو كما يلي:
الطبقة العامة atomicintegerfieldupdatertest {private static static atomicintegerfieldupdater <Ser> a = atomicintegerfieldupdater.newupdater (user.class ، "old") ؛ public static void main (string [] args) {user conan = new user ("conan" ، 10) ؛ system.out.println (A.GetAndIncrement (conan)) ؛ system.out.println (A.Get (Conan)) ؛} مستخدم الفئة الثابتة العامة {اسم السلسلة الخاصة ؛ publatile publatile int old ؛ strend order ؛ int end) {this.name = name ؛ old = old ؛الإخراج
1011
لخص
ما سبق هو المحتوى الكامل لهذه المقالة حول مقدمة واستخدام الحزمة الذرية متعددة الخيوط Java. آمل أن يكون ذلك مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
مقدمة لطريقة كتابة نموذج مستهلك الإنتاج في ظل ظروف مختلفة في Java MultiThreading
Java Multithed Programming Synchronizer Future و FutureTask Aporting and Code Ampressings
شرح مفصل لقفل عرض Java متعدد الخيوط وقفل مدمج
إذا كانت هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها.