java - প্রোগ্রামিং কি "পরমাণু" মানে?




atomic (4)

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

কার্যকরী জাভা বইতে এটি বলে:

ভাষা স্পেসিফিকেশন গ্যারান্টি দেয় যে একটি ভেরিয়েবল পড়া বা লেখার পরমাণু হয় যতক্ষণ না পরিবর্তনশীল long বা double [JLS, 17.4.7]।

জাভা প্রোগ্রামিং বা সাধারণ প্রোগ্রামিংয়ের প্রসঙ্গে "পারমাণবিক" অর্থ কী?


এখানে একটি উদাহরণ, কারণ একটি উদাহরণ একটি দীর্ঘ ব্যাখ্যা চেয়ে প্রায়ই পরিষ্কার। ধরুন foo টাইপের একটি পরিবর্তনশীল। নিম্নলিখিত অপারেশন একটি পারমাণবিক অপারেশন নয়:

foo = 65465498L;

প্রকৃতপক্ষে, পরিবর্তনশীল দুটি পৃথক অপারেশন ব্যবহার করে লেখা হয়: প্রথম 32 বিট লিখেছেন এবং দ্বিতীয় 32 টি বিট লিখেছেন এমন একটি দ্বিতীয়। এর মানে হল যে অন্য থ্রেড foo এর মান পড়তে পারে এবং মধ্যবর্তী অবস্থা দেখতে পারে।

অস্ত্রোপচার পরমাণু তৈরি করা হয় যে কোনও থ্রেড থেকে, একক, পারমাণবিক (অর্থাৎ অংশে বিভাজনযোগ্য), অপারেশন হিসাবে অপারেশন দেখা যায় তা নিশ্চিত করার জন্য সিঙ্ক্রোনাইজেশন প্রক্রিয়া ব্যবহার করে গঠিত। এর অর্থ হল যে অন্য যে কোন থ্রেড, একবার অপারেশনটি পরমাণু তৈরি করা হয়, তারপরে অ্যাসাইনমেন্টের পূর্বে বা অ্যাসাইনমেন্টের পরে foo এর মানটি দেখতে হবে। কিন্তু অন্তর্বর্তী মান না।

এটি করার একটি সহজ উপায় পরিবর্তনশীল অস্থির করা হয় :

private volatile long foo;

অথবা পরিবর্তনশীল প্রতি অ্যাক্সেস সিঙ্ক্রোনাইজ করতে:

public synchronized void setFoo(long value) {
    this.foo = value;
}

public synchronized long getFoo() {
    return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized

অথবা এটি একটি AtomicLong প্রতিস্থাপন করুন:

private AtomicLong foo;

যদি আপনার নীচের কোডটিতে m1 এবং m2 পদ্ধতিগুলি নির্বাহ করার কয়েকটি থ্রেড থাকে:

class SomeClass {
    private int i = 0;

    public void m1() { i = 5; }
    public int m2() { return i; }
}

আপনি গ্যারান্টি আছে যে m2 কলিং কোন থ্রেড হয় 0 বা 5 পড়তে হবে।

অন্যদিকে, এই কোডটি দিয়ে (যেখানে i একটি দীর্ঘ):

class SomeClass {
    private long i = 0;

    public void m1() { i = 1234567890L; }
    public long m2() { return i; }
}

একটি থ্রেড কলিং m2 0, 1234567890L, বা অন্য কোনও র্যান্ডম মান পড়তে পারে কারণ বিবৃতি i = 1234567890L long জন্য পারমাণবিক হতে গ্যারান্টিযুক্ত নয় (একটি JVM দুটি 32 টি বিট এবং শেষ দুটি 32 টি বিট এবং দুইটি অপারেশন এবং একটি থ্রেড লিখতে পারে i মধ্যে মধ্যে পালন করতে পারে)।


শুধু একটি পোস্ট পরমাণু বনাম অ পারমাণবিক অপারেশন আমার খুব সহায়ক হতে পাওয়া।

"শেয়ারকৃত স্মৃতিতে কাজ করা একটি ক্রিয়াকলাপটি পরমাণু যদি এটি অন্য থ্রেডগুলির সাথে সম্পর্কিত একক ধাপে সম্পন্ন হয়।

যখন কোনও পারমাণবিক দোকান একটি ভাগ করা মেমরিতে সঞ্চালিত হয়, তখন অন্য কোনও থ্রেড সংশোধনটি অর্ধ-সম্পূর্ণ পরিদর্শন করতে পারে না।

যখন একটি পারমাণবিক লোড একটি ভাগ করা পরিবর্তনশীল উপর সঞ্চালিত হয়, এটি একটি মুহূর্তে উপস্থিত হিসাবে এটি সম্পূর্ণ মান পড়া। "





atomic