Random
ক্লাসের একটি উদাহরণ একাধিক থ্রেডের মধ্যে ভাগ করা বৈধ ? এবং nextInt(int)
বিশেষত একাধিক থ্রেড থেকে কল করতে ?
java.util.concurrent.ThreadLocalRandom
।
Random
ক্লাসের একটি উদাহরণ একাধিক থ্রেডের মধ্যে ভাগ করা বৈধ ? এবং nextInt(int)
বিশেষত একাধিক থ্রেড থেকে কল করতে ?
java.util.concurrent.ThreadLocalRandom
।
উত্তর:
এটি একাধিক থ্রেড দ্বারা ব্যবহৃত যখন এটি এখনও এলোমেলো সংখ্যা উত্পন্ন করবে অর্থে এটি থ্রেড নিরাপদ।
সূর্যের / ওরাকল জেভিএম বাস্তবায়ন থ্রেডগুলি জুড়ে ধারাবাহিকতা উন্নত করতে বীজ হিসাবে সিঙ্ক্রোনাইজড এবং অ্যাটমিকলং ব্যবহার করে। তবে ডকুমেন্টেশনের সমস্ত প্ল্যাটফর্ম জুড়ে এটি গ্যারান্টিযুক্ত বলে মনে হচ্ছে না।
আমি আপনার প্রোগ্রামটি এমন গ্যারান্টিটির প্রয়োজনে লিখব না, বিশেষত আপনি যে আদেশটি nextInt()
ডাকা হবে তা নির্ধারণ করতে পারবেন না ।
এটি থ্রেড নিরাপদ, যদিও এটি সর্বদা ছিল না।
আরও বিশদ জানতে http://bugs.sun.com/bugdatedia/view_bug.do?bug_id=6362070 দেখুন ।
ডকুমেন্টেশন অনুসারে, ম্যাথআরন্ডম () গ্যারান্টি দেয় যে এটি একাধিক থ্রেড দ্বারা ব্যবহারের জন্য নিরাপদ। তবে এলোমেলো ক্লাস হয় না। আমি ধরে নিই তখন আপনাকে এটি নিজেই সিঙ্ক্রোনাইজ করতে হবে।
হ্যাঁ, র্যান্ডম থ্রেড নিরাপদ। nextInt()
পদ্ধতি সুরক্ষিত আহ্বান next(int)
পদ্ধতি যা ব্যবহার AtomicLong seed, nextseed
(পারমাণবিক দীর্ঘ) একটি পরবর্তী বীজ তৈরি করতে। AtomicLong
বীজ উত্পাদনের উপর থ্রেড-সুরক্ষার জন্য ব্যবহৃত হয়।
যেমনটি বলা হয়েছে, এটি থ্রেড সেভ, তবে এই নিবন্ধটি (লিঙ্ক ডেড) java.util.concurrent.ThreadLocalRandom
অনুযায়ী ব্যবহার করা বুদ্ধিমান হতে পারে । থ্রেডলোক্যালর্যান্ডমও র্যান্ডম এর একটি সাবক্লাস, তাই এটি পিছনের দিকে সামঞ্জস্যপূর্ণ।
নিবন্ধ তুলনা বিভিন্ন এলোমেলো ক্লাস ফলাফল প্রোফাইলিং লিঙ্ক:
java.util.Random
,java.util.concurrent.ThreadLocalRandom
এবংjava.lang.ThreadLocal<java.util.Random>
। ফলাফলগুলি দেখিয়েছে যে থ্রেডলোক্যালর্যান্ডমের ব্যবহার সর্বাধিক পরিবেশনাকারী এবং তারপরে থ্রেডলোকাল এবং সবচেয়ে খারাপ সঞ্চালিত র্যান্ডম নিজেই।
একাধিক থ্রেড সমস্ত একই র্যান্ডম ব্যবহার করতে পারে না এমন কোনও কারণ নেই। তবে, যেহেতু ক্লাসটি স্পষ্টভাবে থ্রেড-নিরাপদ নয় এবং বীজের মাধ্যমে সিউডো-এলোমেলো সংখ্যার ক্রম বজায় রাখে। একাধিক থ্রেড একই র্যান্ডম সংখ্যার সাথে শেষ হতে পারে। প্রতিটি থ্রেডের জন্য একাধিক র্যান্ডম তৈরি করা এবং সেগুলি আলাদাভাবে বীজ করা ভাল।
সম্পাদনা : আমি সবেমাত্র লক্ষ্য করেছি যে সূর্যের প্রয়োগটি অ্যাটমিকলং ব্যবহার করেছে সুতরাং আমি অনুমান করি যে এটি থ্রেড-নিরাপদ (পাশাপাশি পিটার লরে (+1) দ্বারা উল্লিখিত)।
সম্পাদনা 2 : ওপেনজেডিকে বীজের জন্য অ্যাটমিকলংও ব্যবহার করে। অন্যরা যেমন বলেছেন যদিও এটি এখনও নির্ভর করা ভাল না।
র্যান্ডম পারমাণবিক ভেরিয়েবল ব্যবহার করে না ধরেই আমি কীভাবে সমস্যার মোকাবিলা করেছি তা এখানে। currentTime * thread id
ভবিষ্যতে কিছু সময়ের সমান হলে এটি এলোমেলোভাবে সংঘর্ষ করতে পারে তবে এটি আমার প্রয়োজনের জন্য যথেষ্ট বিরল। সংঘর্ষের সম্ভাবনাটি এড়াতে আপনি প্রতিটি অনুরোধের জন্য একটি অনন্য ক্লক টাইমস্ট্যাম্পের জন্য অপেক্ষা করতে পারেন।
/**
* Thread-specific random number generators. Each is seeded with the thread
* ID, so the sequence of pseudo-random numbers are unique between threads.
*/
private static ThreadLocal<Random> random = new ThreadLocal<Random>() {
@Override
protected Random initialValue() {
return new Random(
System.currentTimeMillis() *
Thread.currentThread().getId());
}
};
(24*60*60*1000)
অংশ উল্লেখযোগ্য?
(24*60*60*1000)
যে আইডি দিয়ে একটি থ্রেড তাই ছিল 12
এ xxxxxxxxxx045
Millis বীজযুক্ত হয়নি একটি থ্রেড হিসাবে একই 22
সময়ে xxxxxxxxxx035
Millis। তবে থ্রেড আইডিগুলি ইনক্রিমেন্টাল বলে ধরে নেওয়ার আমার কাছে কোনও ভাল কারণ নেই এবং আমি আজকের চেয়ে কালকে এলোমেলো সময়ে থ্রেড তৈরি করছি তা ভাবার কোনও ভাল কারণ নেই। আমি এখনই আলগকে সরল করে দিয়েছি এবং ত্রুটিটি শনাক্ত করার জন্য বিবরণটি আপডেট করেছি।
Random
বর্গ একাধিক থ্রেড ব্যবহৃত হবে এক উদাহরণস্বরূপ সেট আপ করা হয়নি। অবশ্যই, আপনি যদি এটি করেন তবে সম্ভবত আপনি প্রাক-অনুমানযোগ্য এবং এলোমেলো সংখ্যার কাছাকাছি যাওয়ার সম্ভাবনা বাড়িয়ে তুলবেন । তবে যেহেতু এটি ছদ্ম-এলোমেলো জেনারেটর, তাই আপনি কেন একটি উদাহরণ ভাগ করে নেওয়ার প্রয়োজন তা আমি দেখতে পাচ্ছি না। আরও নির্দিষ্ট প্রয়োজন আছে?