দ্রষ্টব্য : মূলত আমি চিত্রের উদ্দেশ্যে এই উত্তরটিতে সি # কোড পোস্ট করেছি, যেহেতু সি # আপনাকে কীওয়ার্ডের int
সাথে রেফারেন্স দিয়ে প্যারামিটারগুলি পাস করতে দেয় ref
। আমি সি-তে MutableInt
কী কী আনুমানিক সাজানোর জন্য গুগলে পাওয়া প্রথম শ্রেণীর ব্যবহার করে প্রকৃত আইনী জাভা কোড দিয়ে এটি আপডেট করার সিদ্ধান্ত নিয়েছি ref
। এটি উত্তরটি সাহায্য করে বা আঘাত করে কিনা আমি সত্যিই বলতে পারি না। আমি বলব যে আমি ব্যক্তিগতভাবে এতটা জাভা উন্নয়ন করিনি; সুতরাং সবার জন্য আমি জানি যে এই বিষয়টি চিত্রিত করার জন্য আরও অনেকগুলি মুচলেকা উপায় থাকতে পারে।
সম্ভবত আমরা যদি কোনও পদ্ধতি লিখে রাখি যা x++
এটি কী করে তার সমতুল্য করার জন্য এটি আরও পরিষ্কার করে দেবে।
public MutableInt postIncrement(MutableInt x) {
int valueBeforeIncrement = x.intValue();
x.add(1);
return new MutableInt(valueBeforeIncrement);
}
রাইট? উত্তীর্ণ হওয়া মান বৃদ্ধি করুন এবং আসল মানটি ফিরিয়ে দিন: এটি পোস্ট-সংশ্লেষ অপারেটরের সংজ্ঞা।
এখন, আসুন দেখুন আপনার উদাহরণ কোডে এই আচরণটি কীভাবে কার্যকর হয়:
MutableInt x = new MutableInt();
x = postIncrement(x);
postIncrement(x)
কি করে? x
হ্যাঁ, বৃদ্ধি । এবং তারপরে ইনক্রিমেন্টের আগে যা x
ছিল তা ফিরিয়ে দেয় । এই রিটার্ন মানটি তখন নির্ধারিত হয় x
।
সুতরাং নির্ধারিত মানগুলির ক্রম x
0, তারপরে 1, তার পরে 0 হবে।
আমরা উপরেরটি আবার লিখলে এটি আরও স্পষ্ট হতে পারে:
MutableInt x = new MutableInt(); // x is 0.
MutableInt temp = postIncrement(x); // Now x is 1, and temp is 0.
x = temp; // Now x is 0 again.
x
উপরের অ্যাসাইনমেন্টটির বাম দিকে আপনি যখন প্রতিস্থাপন করেন তখন এই বিষয়ে আপনার স্থিরতা y
"আপনি দেখতে পাচ্ছেন যে এটি প্রথমে এক্স বৃদ্ধি করে এবং পরে এটি y এর সাথে যুক্ত করে" আমাকে বিভ্রান্ত করে তোলে। এটি x
যে বরাদ্দ করা হচ্ছে তা নয় y
; এটি পূর্বে নির্ধারিত মানx
। সত্যই, ইনজেকশন y
জিনিসকে উপরের পরিস্থিতি থেকে আলাদা করে তোলে না; আমরা কেবল পেয়েছি:
MutableInt x = new MutableInt(); // x is 0.
MutableInt y = new MutableInt(); // y is 0.
MutableInt temp = postIncrement(x); // Now x is 1, and temp is 0.
y = temp; // y is still 0.
সুতরাং এটি পরিষ্কার: x = x++
কার্যকরভাবে এক্স এর মান পরিবর্তন করে না। এটি সর্বদা x এর মান x 0 , তারপরে x 0 + 1 এবং তারপরে আবার x 0 করে।
আপডেট : ঘটনাচক্রে, সম্ভবত আপনি সন্দেহ করবেন না যে x
উপরোক্ত উদাহরণে বর্ধিত ক্রিয়াকলাপ এবং অ্যাসাইনমেন্টের মধ্যে কখনই "1" অর্পণ করা হয়েছে, আমি একটি দ্রুত ডেমো একসাথে নিক্ষেপ করেছি যে এই মধ্যবর্তী মানটি প্রকৃতপক্ষে "বিদ্যমান" আছে যদিও এটি হবে এক্সিকিউটিভ থ্রেডে কখনই "দেখা" হবে না।
ডেমো x = x++;
একটি লুপে কল করে যখন একটি পৃথক থ্রেড ক্রমাগত x
কনসোলের মান প্রিন্ট করে ।
public class Main {
public static volatile int x = 0;
public static void main(String[] args) {
LoopingThread t = new LoopingThread();
System.out.println("Starting background thread...");
t.start();
while (true) {
x = x++;
}
}
}
class LoopingThread extends Thread {
public @Override void run() {
while (true) {
System.out.println(Main.x);
}
}
}
নীচে উপরের প্রোগ্রামটির আউটপুট এর একটি অংশ রয়েছে। 1 এবং 0 উভয় ক্ষেত্রেই অনিয়মিত ঘটনা লক্ষ্য করুন।
পটভূমি থ্রেড শুরু হচ্ছে ...
0
0
1
1
0
0
0
0
0
0
0
0
0
0
1
0
1