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


273

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

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

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


24
এক সময় একটি অপারেশন।
সুভ্রজ্যোতি মজুমদার

1
একবারে ভেরিয়েবলে কেবল একটি অপারেশন করা যায়।
কেসুশ


1
আমি সন্দেহ দর্শন প্রশ্ন অন্তর্গত codereview.stackexchange.com
Phlip

উল্লেখ করে যে কিছু ভেরিয়েবলের ডিফল্টরূপে পারমাণবিক পড়া এবং লেখা থাকে না, এগুলি ঘোষণা করে volatile longবা পাঠ্যকে অণু হিসাবে volatile doubleপাঠায় এবং পারমাণবিক লেখেন।
H2ONaCl

উত্তর:


372

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

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;

75
সুতরাং এটি ধরে নিচ্ছে যে এটি 32-বিট সিস্টেমে চলছে। যদি এটি 64 বিট সিস্টেম ছিল? উইল foo = 65465498L; তাহলে পারমাণবিক হতে হবে?
হার্ক

46
@ হার্ক আপনি যদি 64 বিট জাভা চালাচ্ছেন তবে হ্যাঁ।
জেরোইন

4
এটি কি সি # এবং। নেটও প্রযোজ্য? যদি হ্যাঁ, একটি পারমাণবিক আচরণ পেতে চেষ্টা করতে, সিএলআর অবশ্যই 64-বিট হওয়া উচিত?
ফাবিয়ানো

5
@ ফ্যাবিয়ানো এটি প্রয়োগ করে এবং জাট এর মতো সিঙ্ক্রোনাইজড কীওয়ার্ড না থাকায় এটি নেট কীভাবে অর্জন করবেন তা এখানে রয়েছে। stackoverflow.com/questions/541194/…
দ্য মাফিন ম্যান

2
এর পরে থ্রেড ধরে নেওয়া যাক একটি দীর্ঘ মান নির্ধারণ করে তারপরে অর্ধপথে থ্রেড বি এটি পড়ার চেষ্টা করে। অপারেশন এ যদি পারমাণবিক হয় তবে থ্রেড বি শেষ না হওয়া পর্যন্ত অপেক্ষা করবে? এর অর্থ পারমাণবিক ক্রিয়াকলাপগুলি অন্তর্নিহিত থ্রেড-সুরক্ষা সরবরাহ করবে?
তেওমন শিপাহি

60

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


25

এটি এমন কিছু যা "তাত্ক্ষণিকভাবে সিস্টেমের বাকী অংশে উপস্থিত হয়" এবং গণনা প্রক্রিয়াগুলিতে লিনিয়ারাইজিবিলিটির শ্রেণিবদ্ধকরণের আওতায় আসে । লিঙ্কিত নিবন্ধটি আরও উদ্ধৃত:

পারমাণবিকতা সমবর্তী প্রক্রিয়াগুলি থেকে বিচ্ছিন্ন হওয়ার গ্যারান্টি। অতিরিক্তভাবে, পারমাণবিক ক্রিয়াকলাপগুলির সাধারণত একটি সফল বা ব্যর্থ সংজ্ঞা থাকে - তারা হয় সফলভাবে সিস্টেমের অবস্থার পরিবর্তন করে, বা এর কোনও স্পষ্ট প্রভাব নেই।

সুতরাং, উদাহরণস্বরূপ, একটি ডাটাবেস সিস্টেমের প্রসঙ্গে, একজনের 'পারমাণবিক প্রতিশ্রুতি' থাকতে পারে, যার অর্থ আপনি একটি সম্পর্কিত ডেটাবেজে আপডেটের পরিবর্তনকে ধাক্কা দিতে পারেন এবং এই পরিবর্তনগুলি হয় সমস্ত জমা দেওয়া হবে, বা এগুলির কোনওটিই মোটেও হবে না ব্যর্থতার ঘটনা, এই উপায়ে ডেটাটি দুর্নীতিগ্রস্থ হয়ে ওঠে না এবং লক এবং / বা সারিগুলির ফলস্বরূপ, পরবর্তী ক্রিয়াকলাপটি একটি ভিন্ন লিখন বা একটি পঠনযোগ্য হবে, তবে কেবল তথ্যের পরে । ভেরিয়েবল এবং থ্রেডিংয়ের প্রসঙ্গে এটি অনেকটা একই, স্মৃতিতে প্রয়োগ।

আপনার উদ্ধৃতি হাইলাইট করে যে এটি সমস্ত দৃষ্টান্তে আচরণের আশা করা উচিত নয় need


15

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

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

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

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


14

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

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; }
}

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


আপনি কেন মনে করেন যে "দীর্ঘ" সমস্যা সৃষ্টি করে যখন "ইনট" না করে? দয়া করে এখানে geewwithblogs.net/BlackRabbitCoder/archive/2012/08/09/… দেখুন
onwayway133

1
@ এন্ট্রপি দীর্ঘ এবং ডাবল অ্যাসাইনমেন্ট জাভাতে পারমাণবিক হওয়ার গ্যারান্টিযুক্ত নয়। সুতরাং আপনি একটি দীর্ঘ পড়তে পারেন যেখানে একটি অর্পণের পরে কেবলমাত্র অর্ধেক বিট আপডেট করা হয়েছে।
Assylias

0

জাভাতে দীর্ঘ এবং ডাবল ব্যতীত সকল প্রকারের পাঠ্য এবং রচনার ক্ষেত্রগুলি পরমাণুভাবে ঘটে এবং ক্ষেত্রটি যদি অস্থির সংশোধক দ্বারা ঘোষিত হয় তবে লম্বা এবং দ্বিগুণ এমনকি পরমাণুভাবে পড়া এবং লিখিত হয়। এটি হ'ল, আমরা সেখানে যা ছিল তা 100% পেয়েছি, বা সেখানে কী ঘটেছিল, বা ভেরিয়েবলগুলির মধ্যে কোনও মধ্যবর্তী ফলাফল হতে পারে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.