সম্পর্কে গুরুত্বপূর্ণ বিষয় volatile
:
- জাভাতে সিঙ্ক্রোনাইজেশন জাভা কীওয়ার্ড
synchronized
এবং ব্যবহার করে সম্ভবvolatile
এবং কেশ।
- জাভাতে, আমরা
synchronized
ভেরিয়েবল রাখতে পারি না । synchronized
ভেরিয়েবল সহ কীওয়ার্ড ব্যবহার করা অবৈধ এবং এর ফলে সংকলন ত্রুটি হবে। পরিবর্তে ব্যবহার করুনsynchronized
জাভা পরিবর্তনশীল, আপনি জাভা ব্যবহার করতে পারেন volatile
মান পড়তে পরিবর্তনশীল, যা জেভিএম থ্রেড নির্দেশ দেওয়া হবেvolatile
প্রধান মেমরি থেকে পরিবর্তনশীল এবং এটি স্থানীয়ভাবে ক্যাশে না।
- যদি কোনও ভেরিয়েবল একাধিক থ্রেডের মধ্যে ভাগ না করা হয় তবে
volatile
কীওয়ার্ডটি ব্যবহার করার দরকার নেই ।
সূত্র
এর ব্যবহারের উদাহরণ volatile
:
public class Singleton {
private static volatile Singleton _instance; // volatile variable
public static Singleton getInstance() {
if (_instance == null) {
synchronized (Singleton.class) {
if (_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
}
প্রথম অনুরোধটি আসার সময় আমরা অলসভাবে উদাহরণ তৈরি করছি।
যদি আমরা _instance
পরিবর্তনশীল না করি volatile
তবে যে থ্রেডের উদাহরণ তৈরি Singleton
হচ্ছে তা অন্য থ্রেডে যোগাযোগ করতে সক্ষম নয়। সুতরাং যদি থ্রেড এ সিঙ্গেলটন উদাহরণ তৈরি করছে এবং তৈরির ঠিক পরে, সিপিইউকে ক্ষতিগ্রস্থ করে ইত্যাদি, অন্যান্য সমস্ত থ্রেডের মান দেখতে সক্ষম হবে না_instance
নাল হিসাবে এবং তারা বিশ্বাস করবে যে এটি এখনও নাল বরাদ্দ করা হয়েছে।
কেন এমন হয়? কারণ পাঠক থ্রেডগুলি কোনও লকিং করছে না এবং যতক্ষণ না লেখক থ্রেড একটি সিঙ্ক্রোনাইজড ব্লক থেকে আসে, মেমরিটি সিঙ্ক্রোনাইজ _instance
হবে না এবং মূল স্মৃতিতে মানটির আপডেট হবে না। জাভাতে ভোল্টাইল কীওয়ার্ড সহ, এটি নিজেই জাভা দ্বারা পরিচালিত হয় এবং এই জাতীয় আপডেটগুলি সমস্ত পাঠক থ্রেড দ্বারা দৃশ্যমান হবে।
উপসংহার : volatile
কীওয়ার্ডটি থ্রেডগুলির মধ্যে মেমরির বিষয়বস্তু যোগাযোগ করার জন্যও ব্যবহৃত হয়।
অস্থির ছাড়া ব্যবহারের উদাহরণ:
public class Singleton{
private static Singleton _instance; //without volatile variable
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null) _instance = new Singleton();
}
}
return _instance;
}
উপরের কোডটি থ্রেড-নিরাপদ নয়। যদিও এটি পুনরায় সিঙ্ক্রোনাইজড ব্লকের মধ্যে (পারফরম্যান্সের কারণে) উদাহরণের মানটি যাচাই করে, জেআইটি সংকলক বাইটকোডটিকে এমনভাবে পুনর্ব্যবহার করতে পারে যে কনস্ট্রাক্টরের কার্য সম্পাদন শেষ হওয়ার আগে উদাহরণের রেফারেন্স সেট হয়ে যায়। এর অর্থ getInstance () পদ্ধতিটি এমন কোনও বস্তু প্রদান করে যা পুরোপুরি আরম্ভ করা হয়নি। কোডটি থ্রেড-নিরাপদ করতে, কীওয়ার্ডটি অস্থির হয় জাভা 5 থেকে উদাহরণটি পরিবর্তনশীল হিসাবে ব্যবহার করা যেতে পারে। ভেরিয়েবলগুলি যেমন অস্থির হিসাবে চিহ্নিত করা হয় কেবল তখনই অন্য থ্রেডগুলিতে দৃশ্যমান হয়ে যায় যখন বস্তুর নির্মাতা সম্পূর্ণরূপে এটির কাজ শেষ করে।
সূত্র
volatile
জাভা ব্যবহার :
ব্যর্থ-দ্রুত পুনরাবৃত্তকারীরা সাধারণতvolatile
তালিকা তালিকার একটি কাউন্টার ব্যবহার করে প্রয়োগ করা হয় ।
- তালিকা আপডেট করা হলে, কাউন্টারটি বাড়ানো হয়।
- যখন একটি
Iterator
তৈরি করা হয়, কাউন্টারটির বর্তমান মানটি Iterator
বস্তুটিতে এম্বেড করা হয় ।
- যখন একটি
Iterator
অপারেশন করা হয়, তখন পদ্ধতিটি দুটি পাল্টা মানগুলির সাথে তুলনা করে এবং ConcurrentModificationException
সেগুলি পৃথক হলে একটি নিক্ষেপ করে ।
ব্যর্থ-নিরাপদ পুনরাবৃত্তিগুলির বাস্তবায়ন সাধারণত হালকা ওজন। তারা সাধারণত নির্দিষ্ট তালিকা প্রয়োগের ডেটা স্ট্রাকচারের বৈশিষ্ট্যের উপর নির্ভর করে। কোনও সাধারণ প্যাটার্ন নেই।
volatile
জেএসআর 133-এ সংজ্ঞায়িত নতুন জাভা মেমোরি মডেলটির সাথে আসে তার একটি গুরুত্বপূর্ণ সম্পত্তি বাদ দেয় : যে কোনও থ্রেড যখন কোনওvolatile
ভেরিয়েবলটি পড়ে তখন এটি কেবল অন্য থ্রেডের দ্বারা এটিতে লেখা সর্বশেষ মানটিই দেখতে পায় না, তবে সমস্ত অন্যান্য অন্যান্য ভেরিয়েবলগুলিকেও লেখেন যেvolatile
লেখার সময় অন্য থ্রেডে দৃশ্যমান ছিল । দেখুন এই উত্তর এবং এই রেফারেন্স ।