আমার ল্যাবটিতে একটি সংবেদনশীল অপারেশন আজ সম্পূর্ণ ভুল হয়েছে। একটি ইলেক্ট্রন মাইক্রোস্কোপের একটি অ্যাকিউউটর তার সীমানা পেরিয়ে গিয়েছিল এবং ঘটনাগুলির একটি শৃঙ্খলের পরে আমি 12 মিলিয়ন ডলার সরঞ্জাম হারিয়েছি। আমি ত্রুটিযুক্ত মডিউলটিতে 40K এর বেশি লাইন সংকুচিত করেছি:
import java.util.*;
class A {
static Point currentPos = new Point(1,2);
static class Point {
int x;
int y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public static void main(String[] args) {
new Thread() {
void f(Point p) {
synchronized(this) {}
if (p.x+1 != p.y) {
System.out.println(p.x+" "+p.y);
System.exit(1);
}
}
@Override
public void run() {
while (currentPos == null);
while (true)
f(currentPos);
}
}.start();
while (true)
currentPos = new Point(currentPos.x+1, currentPos.y+1);
}
}
আমি যে আউটপুটটি পাচ্ছি তার কয়েকটি নমুনা:
$ java A
145281 145282
$ java A
141373 141374
$ java A
49251 49252
$ java A
47007 47008
$ java A
47427 47428
$ java A
154800 154801
$ java A
34822 34823
$ java A
127271 127272
$ java A
63650 63651
যেহেতু এখানে কোনও ভাসমান পয়েন্ট গণিত নেই, এবং আমরা সবাই জানি স্বাক্ষরিত পূর্ণসংখ্যাগুলি জাভাতে ওভারফ্লোতে ভাল আচরণ করে, তাই আমি মনে করি এই কোডটিতে কোনও ভুল নেই। যাইহোক, আউটপুটটি নির্দেশ করে যে প্রোগ্রামটি প্রস্থান অবস্থায় পৌঁছায়নি, এটি প্রস্থান শর্তে পৌঁছেছে (এটি উভয়ই পৌঁছেছিল এবং পৌঁছেছে না?)। কেন?
আমি লক্ষ্য করেছি যে এটি কিছু পরিবেশে ঘটে না। আমি J৪- বিট লিনাক্সের ওপেনজেডকে on এ আছি ।
final
কোয়ালিফায়ার ক্ষেত্র (যা উত্পাদিত বাইটকোড উপর কোনো প্রভাব নেই) x
এবং y
"সমাধান" বাগ। যদিও এটি বাইটোকোডকে প্রভাবিত করে না, ক্ষেত্রগুলি এটির সাথে পতাকাযুক্ত রয়েছে, যা আমাকে ভাবতে পরিচালিত করে যে এটি একটি জেভিএম অপ্টিমাইজেশনের পার্শ্ব-প্রতিক্রিয়া।
Point
p
হয় যা সন্তুষ্ট হয় p.x+1 == p.y
, তারপরে ভোটার থ্রেডে একটি রেফারেন্স দেওয়া হয়। অবশেষে ভোটগ্রহণের থ্রেডটি প্রস্থান করার সিদ্ধান্ত নেয় কারণ এটি মনে করে যে এটির যে কোনও একটির জন্য শর্তটি সন্তুষ্ট নয় Point
, তবে কনসোল আউটপুট দেখায় যে এটি সন্তুষ্ট হওয়া উচিত ছিল। এখানে অভাবের volatile
সহজ অর্থ হ'ল ভোটদানের সূত্রটি আটকে যেতে পারে, তবে এটি স্পষ্টতই এখানে সমস্যা নয়।
synchronized
ত্রুটি ঘটায় না? কারণ আমি এলোমেলোভাবে কোড লিখতে হয়েছিল যতক্ষণ না আমি এমন কোনও আবিষ্কার খুঁজে পেয়েছি যা এই আচরণকে নির্জনে পুনরুত্পাদন করতে পারে।