কম্পিউটার

জাভাতে মেমরির সামঞ্জস্যতা ত্রুটি


যখন মাল্টিথ্রেডিংয়ের ধারণাটি বাস্তবায়িত হয়, তখন এটি সম্ভব যে একটি থ্রেড দ্বারা করা পরিবর্তনগুলি অন্য থ্রেডে দৃশ্যমান হবে না। এটি নির্দেশ করে যে প্রতিটি থ্রেডের দৃষ্টিভঙ্গি একে অপরের সাথে অসঙ্গতিপূর্ণ। এটি মেমরির ধারাবাহিকতা ত্রুটি হিসাবে পরিচিত৷

CPU একটি ভিন্ন ক্রমানুসারে প্রধান মেমরি অ্যাক্সেস শুরু করতে পারে, যেখানে থ্রেডগুলি একটি ভিন্ন ক্রমানুসারে থিমিন অ্যাক্সেস করতে পারে৷

এটি সাধারণত সত্য হয় যখন লেখার ক্রিয়াকলাপ সঞ্চালিত হয়, যার ফলে CPU অপেক্ষার সময় এড়ানো হয়।

লেখার ক্রিয়াকলাপটি একটি পারমাণবিক, যার অর্থ অন্য কোনো অপারেশন অন্য থ্রেড দ্বারা সঞ্চালিত হবে না যখন একটি লেখার অপারেশন করা হচ্ছে৷

এটি ছাড়াও, যে ক্রমানুসারে লেখার ক্রিয়াকলাপ সঞ্চালিত হয় তা প্রতিটি সংশ্লিষ্ট CPU-এর জন্য ধারাবাহিকভাবে বজায় রাখা হবে, যেখানে CPU গুলি অন্য CPU-র লেখার সময়গুলিকে ভিন্নভাবে বুঝতে পারে। এই ঘটনাটি স্মৃতির অসংগতির দিকে নিয়ে যেতে পারে।

কিভাবে মেমরির অসঙ্গতি ত্রুটিগুলি এড়ানো যায়?

একটি ঘটানোর আগে সম্পর্ক স্থাপন করা প্রয়োজন যাতে মেমরি লেখা একক থ্রেড দ্বারা সঞ্চালিত হয়, এবং এটি একই মেমরিতে অন্যান্য থ্রেড দ্বারা সম্পাদিত ক্রিয়াকলাপগুলি পড়তে দৃশ্যমান হয়৷

'স্টার্ট' ফাংশন এবং 'যোগদান' ফাংশনকে ঘটছে-আগে সম্পর্ক হিসাবে বিবেচনা করা হয়। 'স্টার্ট' ফাংশনটি নিশ্চিত করে যে নতুন তৈরি থ্রেডটি দৃশ্যমান। 'যোগদান' ফাংশনটি নিশ্চিত করে যে দৃশ্যমান থ্রেডটি অন্য থ্রেডের সাথে যুক্ত হয়েছে।

উদাহরণ

 import java.io.*;class class_shared{ static int m=2; void inc(){ for(int j=0;j<5;j++){ m =m+1; System.out.println("এর বৃদ্ধির পর "+m); } } void dec(){ for(int j=0;j<5;j++){ m =m-1; System.out.println("এর হ্রাস হওয়ার পরে "+m); } }}পাবলিক ক্লাস ডেমো{ public static void main(String[] args){ final class_shared my_inst =new class_shared(); থ্রেড my_t_1 =নতুন থ্রেড(){ @Override public void run(){ my_inst.inc(); } }; থ্রেড my_t_2 =নতুন থ্রেড(){ @Override public void run(){ my_inst.dec(); } }; my_t_1.start(); my_t_2.start(); }}

আউটপুট

এর বৃদ্ধির পরে 3 এর হ্রাস 2 এর পরে এর হ্রাস 2 এর পরে এটির হ্রাস 1 এর পরে এটির বৃদ্ধি 3 এর পরে এটির হ্রাস 0 এর পরে এটির বৃদ্ধি 1 এর পরে এটির বৃদ্ধি 1 এর পরে এটির হ্রাস 0 এর পরে 2 এর পরে 

'class_shared' নামের একটি ক্লাস একটি স্ট্যাটিক মান এবং একটি অকার্যকর ফাংশনকে সংজ্ঞায়িত করে, যা সংখ্যার একটি সেটের উপর পুনরাবৃত্তি করে এবং এটিকে বৃদ্ধি করে এবং এটি কনসোলে প্রদর্শন করে। 'dec' নামের আরেকটি ফাংশন প্রতিবার সংখ্যার একটি সেট এবং হ্রাস করে এবং কনসোলে আউটপুট প্রদর্শন করে। একটি ক্লাসনামযুক্ত ডেমোতে প্রধান ফাংশন থাকে যা ক্লাসের একটি উদাহরণ তৈরি করে এবং একটি নতুন থ্রেড তৈরি করে। এই থ্রেডটি ওভাররাইড করা হয়েছে, এবং এই অবজেক্ট ইনস্ট্যান্সে রান ফাংশন কল করা হয়েছে। দ্বিতীয় থ্রেডের জন্যও একই জিনিস করা হয়েছে। এই উভয় থ্রেডকে তখন 'স্টার্ট' ফাংশন দিয়ে ডাকা হয়।


  1. জাভাতে ইউজার থ্রেড বনাম ডেমন থ্রেড?

  2. উইন্ডোজ আপগ্রেড করার পরে ইন্টেল অপ্টেন মেমরি পিনিং ত্রুটি ঠিক করুন

  3. ঠিক করুন:ERR_SOCKET_NOT_CONNECTED

  4. IRQL_NOT_LESS_OR_EQUAL ত্রুটি ঠিক করুন