جافا: ظروف السباق - هل هناك طريقة للتأكد من تنفيذ عدة أسطر من التعليمات البرمجية معا؟

StackOverflow https://stackoverflow.com/questions/2222175

  •  19-09-2019
  •  | 
  •  

سؤال

لدي صفحة تسجيل تتلقى تحليل Tokens AD لهم وتسجيل الدخول إلى المستخدم إذا تطبق المعلمات.

بين الوقت الذي راجعت الرمز المميز، في الوقت الذي أزلت الرمز المميز من DB، يمكن لمستخدم آخر استخدام نفس الرمز المميز لتسجيل الدخول. هل هناك طريقة للتأكد من أن مجموعة محددة من خطوط التعليمات البرمجية سيتم تنفيذها مع عدم التداخل، لذلك لن أحصل على مشكلة حالة السباق؟

شكرًا

تحديث

لدي اثنين من الخوادم.

  1. اباتشي تومكات 6.
  2. Red5 V0.9 (خامل تدفق الوسائط الفلاش ومقرها Java المجاني)

أنا أكتب تطبيق لعبة على Facebook.

اللعبة نفسها مكتوبة في Adobe Flash Builder 2.

سيتم تقديم اللعبة نفسها باستخدام خادم Red5. المشكلة هي أن Red5 لا يتلقى رؤوس الطلب والاستجابة، وبالتالي لا يمكن استرداد معلومات الجلسة لاستخدامها من أجل جلب معلومات Facebook.

لحل المشكلة الاتصال بالمستخدم بخادم Tomcat، تقوم هذه الصفحة بفحص الجلسة على Facebook Information وتستخدم Tinyfbclient للاتصال ب Facebook، وتخزين المعلومات في MySQL DB (تفاصيل المستخدم)، من أجل التأكد من ذلك نفس المستخدم هو المستخدم الذي سوف يتصل باللون الأحمر.

بمجرد إنشاء رمز رمزي. تعرض صفحة Tomcat عنصر HTML كائن من أجل إظهار ملف SWF ذي الصلة (ملف اللعبة). تقوم صفحة Tomcat بتمرير الرمز المميز إلى هذا الملف SWF. بمجرد تحميل ملف SWF، يأخذ هذا الرمز المميز ويستخدمه للاتصال Red5 ولهذه لمعرفة معلومات المستخدم.

آمل أن يساعدك الوصف في فهم احتياجاتي. شكرا لكم جميعا على دعمكم!

هل كانت مفيدة؟

المحلول

يمكنك استخدام قفل هدف.

استخدام كائنات القفل لديه مزايا على أكثر البدائية كتل متزامنة والأساليب.

نصائح أخرى

يمكنك مزامنة كتلة التعليمات البرمجية، بحيث يمكن تنفيذ مؤشر ترابط واحد فقط في كل مرة. ومع ذلك، هذا لا يبدو وكأنه حل جيد للغاية، لأنه سيتبطئ طلبك. كنت ترغب في تسجيل مستخدمين متعددة في وقت واحد.

كيف يتم إنشاء الرموز؟ إذا كنت ترغب في إنشاءها على جانب الخادم استجابة لمستخدم تسجيل الدخول، فلا ينبغي أن يكون مستخدم واحد قادرا على استخدام رمز مميز مستخدم آخر.

يبدو أنك بحاجة إلى طريقة / كتلة متزامنة:

انظر هنا على سبيل المثال (الطريقة المتزامنة)

http://java.sun.com/docs/books/tutorial/actory/concurrency/syncmeth.html.

كن حذرا على عدم إفراط في طهي الآخر! الكثير من التزامن يمكن أن يؤدي إلى boTlenecking!

لست متأكدا من السبب في إنشاء رمز رمزية لتسجيل الدخول. يبدو أن سؤالك يعني أن هذا الرمز المميز في قاعدة البيانات وليس في الذاكرة. إذا كان الأمر كذلك، فلن تساعد المزامنة والمواد Mutexes حقا، وما تحتاجه هو قفل سجل قاعدة البيانات باستخدام "تحديد للتحديث".

ربما هذا يدخل في الكثير من التعقيد غير ذي صلة، ولكن لماذا تقوم بإنشاء رمز رمزي للقيام بتسجيل الدخول؟ في أي وقت أقوم بتسجيل الدخول، أقوم ببساطة بجمع معرف المستخدم وكلمة المرور من الشاشة أو النموذج الوارد، والتحقق من قاعدة البيانات لمعرفة ما إذا كان الجمع صالحا، وإذا كان الأمر كذلك، فدع المستخدم في. ماذا تحتاج رمزية له؟

أنت تقول أنك "إزالة الرمز المميز من DB". هل قاعدة بيانات قاعدة بيانات SQL؟ إذا كان الأمر كذلك، فيمكنك استخدام معاملة لتجنب شرط السباق. سيبدو شيء هكذا:

  1. إنشاء معرف جلسة فريد، على سبيل المثال UUID sessionID = UUID.randomUUID();
  2. بدء المعاملة
  3. احذف أي رموز من DB التي تتطابق مع واحد في الطلب، على سبيل المثال
    حذف من الرموز حيث tokenid = u003Crequested-token>
  4. الحصول على عدد الصف المتأثر
  5. إذا كان عدد الصف المتأثر هو بالضبط 1، فسيكون الرمز المميز صالحا. إنشاء جلسة، على سبيل المثال
    إدراج في قيم الجلسة (Sessionuuid، Userid، Logintime، ...)
  6. الالتزام المعاملة

الآن إذا كان تسجيل الدخول ناجحا (أي عدد الصف المتأثر كان بالضبط 1)، فأرسل العميل ملف تعريف الارتباط يحتوي على معرف الجلسة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top