পারমাণবিক / উদ্বায়ী / সিঙ্ক্রোনাইজড মধ্যে পার্থক্য কি?


297

কীভাবে পারমাণবিক / উদ্বায়ী / সিঙ্ক্রোনাইজ করা অভ্যন্তরীণভাবে কাজ করে?

নিম্নলিখিত কোড ব্লক মধ্যে পার্থক্য কি?

কোড 1

private int counter;

public int getNextUniqueIndex() {
    return counter++; 
}

কোড 2

private AtomicInteger counter;

public int getNextUniqueIndex() {
    return counter.getAndIncrement();
}

কোড 3

private volatile int counter;

public int getNextUniqueIndex() {
    return counter++; 
}

কি volatileনিম্নলিখিত ভাবে কাজ করে? কি

volatile int i = 0;
void incIBy5() {
    i += 5;
}

সমতুল্য

Integer i = 5;
void incIBy5() {
    int temp;
    synchronized(i) { temp = i }
    synchronized(i) { i = temp + 5 }
}

আমার মনে হয় যে দুটি থ্রেড একই সাথে একটি সিঙ্ক্রোনাইজড ব্লকে প্রবেশ করতে পারে না ... আমি ঠিক আছি? এটি যদি সত্য হয় তবে কীভাবে atomic.incrementAndGet()কাজ না করে synchronized? এবং এটি থ্রেড-নিরাপদ?

এবং অভ্যন্তরীণ পড়া এবং উদ্বায়ী ভেরিয়েবল / পারমাণবিক ভেরিয়েবল লেখার মধ্যে পার্থক্য কি? আমি কিছু নিবন্ধে পড়েছি যে থ্রেডের ভেরিয়েবলগুলির স্থানীয় কপি রয়েছে - এটি কী?


5
এটি এমন একটি সম্পূর্ণ প্রশ্ন তৈরি করে কোড সহ যা সংকলন করে না। অনুশীলনে জাভা কনকুরনশিয়ের মতো আপনার কোনও ভাল বই পড়া উচিত।
জেবি নিজেট

4
@ জেবিনিজেট আপনি ঠিক বলেছেন !!! আমার কাছে সেই বই আছে, এটির সংক্ষিপ্তভাবে পারমাণবিক ধারণা নেই এবং আমি সে সম্পর্কে কিছু ধারণা পাচ্ছি না। অভিশাপ এটা আমার ভুল লেখকের নয়।
হার্ডিক

4
এটি কীভাবে বাস্তবায়িত হয় (এবং এটি ওএসের সাথে পরিবর্তিত হয়) আপনার সত্যই যত্নের দরকার নেই। আপনাকে যা বুঝতে হবে তা হল চুক্তি: মানটি পরমাণুভাবে বৃদ্ধি করা হয় এবং অন্যান্য সমস্ত থ্রেডই নতুন মানটি দেখার নিশ্চয়তা পায়।
জেবি নিজেট

উত্তর:


392

তারা অভ্যন্তরীণভাবে কীভাবে কাজ করে সে সম্পর্কে আপনি বিশেষত জিজ্ঞাসা করছেন , সুতরাং আপনি এখানে আছেন:

কোনও সিঙ্ক্রোনাইজেশন নেই

private int counter;

public int getNextUniqueIndex() {
  return counter++; 
}

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

private boolean stopped;

public void run() {
    while(!stopped) {
        //do some work
    }
}

public void pleaseStop() {
    stopped = true;
}

যোগ volatileকরার জন্য stoppedপরিবর্তনশীল এবং এটি কাজ করে জরিমানা - অন্য কোন থ্রেড মডিফাই যদি stoppedমাধ্যমে পরিবর্তনশীল pleaseStop()পদ্ধতি, আপনি যে পরিবর্তন অবিলম্বে দেখতে থ্রেড এর কাজ গ্যারান্টী আছে while(!stopped)লুপ। : BTW এই একটি ভালো উপায়, হয় একটি থ্রেড সাময়িক বিরতি দেখতে নয় কিভাবে একটি থ্রেড চিরকাল কোনো ব্যবহার না করে চলমান থামাতে এবং একটি নির্দিষ্ট জাভা থ্রেড বন্ধ

AtomicInteger

private AtomicInteger counter = new AtomicInteger();

public int getNextUniqueIndex() {
  return counter.getAndIncrement();
}

AtomicIntegerবর্গ ব্যবহারসমূহ সি এ এস ( তুলনা-এবং-swap 'র ) নিম্নস্তরের CPU- র অপারেশন (কোন সিঙ্ক্রোনাইজেশন প্রয়োজন!) তারা আপনাকে একটি নির্দিষ্ট পরিবর্তনশীল পরিবর্তন করতে শুধুমাত্র যদি বর্তমান মূল্য অন্য কিছু সমান (এবং সফলভাবে ফিরিয়ে দেওয়া হয়) অনুমতি দেয়। সুতরাং আপনি যখন getAndIncrement()এটি কার্যকর করেন তখন আসলে একটি লুপে চালিত হয় (সরলীকৃত বাস্তব বাস্তবায়ন):

int current;
do {
  current = get();
} while(!compareAndSet(current, current + 1));

সুতরাং মূলত: পড়ুন; বর্ধিত মান সংরক্ষণ করার চেষ্টা করুন; সফল না হলে (মানটি আর সমান হয় না current), পড়ুন এবং আবার চেষ্টা করুন। compareAndSet()নেটিভ কোড (সমাবেশ) বাস্তবায়িত হয়।

volatile সিঙ্ক্রোনাইজেশন ছাড়াই

private volatile int counter;

public int getNextUniqueIndex() {
  return counter++; 
}

এই কোডটি সঠিক নয়। এটি দৃশ্যমানতার সমস্যাটি সমাধান করে (এটি volatileনিশ্চিত করে যে অন্যান্য থ্রেডগুলি এর পরিবর্তিত পরিবর্তন দেখতে পারে counter) তবে এখনও রেসের শর্ত রয়েছে। এটি একাধিকবার ব্যাখ্যা করা হয়েছে: প্রাক / উত্তর-বর্ধন পরমাণু নয়।

এর একমাত্র পার্শ্ব প্রতিক্রিয়া volatileহ'ল " ফ্লাশিং " ক্যাশে যাতে অন্যান্য সমস্ত পক্ষই তথ্যের সতেজ সংস্করণটি দেখতে পায়। বেশিরভাগ পরিস্থিতিতে এটি অত্যন্ত কঠোর; এজন্যই volatileডিফল্ট নয়।

volatile সিঙ্ক্রোনাইজেশন ছাড়াই (2)

volatile int i = 0;
void incIBy5() {
  i += 5;
}

উপরের মতো একই সমস্যা, তবে আরও খারাপ কারণ এটিও iনয় private। দৌড়ের অবস্থা এখনও বিদ্যমান। কেন এটি একটি সমস্যা? যদি, বলুন, দুটি থ্রেড একই সাথে এই কোডটি চালায় তবে আউটপুট হতে পারে + 5বা + 10। যাইহোক, আপনি পরিবর্তনটি দেখতে গ্যারান্টিযুক্ত।

একাধিক স্বতন্ত্র synchronized

void incIBy5() {
  int temp;
  synchronized(i) { temp = i }
  synchronized(i) { i = temp + 5 }
}

আশ্চর্য, এই কোডটিও ভুল। আসলে, এটি সম্পূর্ণ ভুল। প্রথমে আপনি সিঙ্ক্রোনাইজ করছেন iযা পরিবর্তন হতে চলেছে (তদ্ব্যতীত, iএকটি আদিম, তাই আমি অনুমান করি আপনি Integerঅটোবক্সিংয়ের মাধ্যমে তৈরি একটি অস্থায়ী সাথে সিঙ্ক্রোনাইজ করছেন ...) সম্পূর্ণ ত্রুটিযুক্ত। আপনি আরও লিখতে পারেন:

synchronized(new Object()) {
  //thread-safe, SRSLy?
}

কোনও দুটি থ্রেড একই লক দিয়ে একই synchronizedব্লকে প্রবেশ করতে পারে না । এই ক্ষেত্রে (এবং একইভাবে আপনার কোডে) লক অবজেক্ট প্রতিটি মৃত্যুদন্ড কার্যকর হওয়ার পরে পরিবর্তিত হয়, তাই কার্যকরভাবে কোনও প্রভাব পড়ে না।synchronized

এমনকি যদি আপনি thisসিঙ্ক্রোনাইজেশনের জন্য একটি চূড়ান্ত পরিবর্তনশীল (বা ) ব্যবহার করেন তবে কোডটি এখনও ভুল। দুটি থ্রেড প্রথমে একযোগে পড়তে iপারে temp(স্থানীয়ভাবে একই মান থাকা temp), তারপরে প্রথমটি একটি নতুন মান নির্ধারণ করে i(বলুন, 1 থেকে 6 পর্যন্ত) এবং অন্যটি একই জিনিসটি করে (1 থেকে 6 পর্যন্ত)।

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

void synchronized incIBy5() {
  i += 5 
}

void incIBy5() {
  synchronized(this) {
    i += 5 
  }
}

void incIBy5() {
  synchronized(this) {
    int temp = i;
    i = temp + 5;
  }
}

10
কেবলমাত্র আমি যুক্ত করব জেভিএম এগুলি পরিচালনা করার জন্য ভেরিয়েবলের মানগুলিকে নিবন্ধগুলিতে অনুলিপি করে। এর অর্থ একটি একক সিপিইউ / কোরে চলমান থ্রেডগুলি এখনও একটি অ-উদ্বায়ী ভেরিয়েবলের জন্য বিভিন্ন মান দেখতে পারে।
ডেভিড হার্কনেস

@ থমাসজ: কি তুলনাআন্ডসেট (বর্তমান, বর্তমান + 1) সিঙ্ক্রোনাইজড ?? যদি দুটি থ্রেড একই সময়ে এই পদ্ধতিটি কার্যকর করে তখন কী হয় ??
হার্ডিক

@ হার্দিক: compareAndSetসিএএস অপারেশনের চারপাশে কেবল একটি পাতলা মোড়ক। আমি আমার উত্তরে কিছু বিশদে যাই।
টমাসজ নুরকিউইচজ

1
@ থমাসাসজ: ঠিক আছে, আমি এই লিঙ্ক প্রশ্নের মধ্য দিয়ে যাচ্ছি এবং জন স্কেকে উত্তর দিয়েছিলাম, তিনি বলেছিলেন যে "থ্রেড কোনও অন্য থ্রেড কোনও রচনা সম্পাদন করেছে কিনা তা পরীক্ষা করেই একটি অস্থির পরিবর্তনশীল পড়তে পারে না।" তবে একটি থ্রেড রাইটিং অপারেশন এবং দ্বিতীয় থ্রেডের মধ্যে পড়ে থাকলে কী হয় !! আমি কি ভূল ?? এটি কি পারমাণবিক অপারেশনের প্রতিযোগিতার শর্ত নয় ??
হার্ডিক

3
@ হার্দিক: আপনি যা জিজ্ঞাসা করছেন সে সম্পর্কে আরও প্রতিক্রিয়া জানাতে দয়া করে অন্য একটি প্রশ্ন তৈরি করুন, এখানে কেবল আপনি এবং আমি এবং মন্তব্য জিজ্ঞাসা করার জন্য উপযুক্ত নয় comments এখানে একটি নতুন প্রশ্নের লিঙ্ক পোস্ট করতে ভুলবেন না যাতে আমি অনুসরণ করতে পারি।
টমাসজ নুরকিউইচজ

61

কোনও ভেরিয়েবলকে অস্থির হিসাবে ঘোষণা করার অর্থ হ'ল তার মানটি তত্ক্ষণাত্ পরিবর্তন করে চলকের আসল মেমরি স্টোরেজকে প্রভাবিত করে। সংকলকটি ভেরিয়েবলের কোনও রেফারেন্স অপ্টিমাইজ করতে পারে না। এটি গ্যারান্টি দেয় যে যখন একটি থ্রেড চলকটি পরিবর্তন করে, অন্য সমস্ত থ্রেড তত্ক্ষণাত নতুন মানটি দেখে। (এটি অ-উদ্বায়ী ভেরিয়েবলগুলির জন্য গ্যারান্টিযুক্ত নয়))

পারমাণবিক ভেরিয়েবল ঘোষণা করে গ্যারান্টি দেয় যে চলকটির উপর করা অপারেশনগুলি পারমাণবিক ফ্যাশনে ঘটে, অর্থাত্ অপারেশনটির সমস্ত সাবস্টিপস সম্পাদিত থ্রেডের মধ্যেই সম্পন্ন হয় এবং অন্যান্য থ্রেড দ্বারা বাধিত হয় না। উদাহরণস্বরূপ, একটি ইনক্রিমেন্ট-এবং-পরীক্ষা অপারেশনের জন্য ভেরিয়েবলটি বাড়ানো দরকার এবং তারপরে অন্য মানের সাথে তুলনা করা হয়; পারমাণবিক অপারেশন গ্যারান্টি দেয় যে এই দুটি পদক্ষেপই সম্পূর্ণ হবে যেন তারা একক অবিভাজ্য / নিরবচ্ছিন্ন অপারেশন ছিল।

কোনও ভেরিয়েবলের সাথে সমস্ত অ্যাক্সেস সিঙ্ক্রোনাইজ করা চলকগুলিকে অ্যাক্সেস করতে একবারে কেবল একটি একক থ্রেডকে অনুমতি দেয় এবং অন্যান্য সমস্ত থ্রেডকে তার অ্যাক্সেস থ্রেডটির পরিবর্তনশীলটিতে অ্যাক্সেস ছাড়ার জন্য অপেক্ষা করতে বাধ্য করে।

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

পারমাণবিকতা, সিঙ্ক্রোনাইজেশন এবং অস্থিরতা স্বাধীন বৈশিষ্ট্য, তবে সাধারণত ভেরিয়েবল অ্যাক্সেসের জন্য যথাযথ থ্রেড সহযোগিতা প্রয়োগের জন্য সংমিশ্রণে ব্যবহৃত হয়।

সংযোজন (এপ্রিল 2016)

কোনও ভেরিয়েবলের সিঙ্ক্রোনাইজড অ্যাক্সেস সাধারণত একটি মনিটর বা সেমফোর ব্যবহার করে প্রয়োগ করা হয় । এগুলি নিম্ন-স্তরের মিউটেক্স (পারস্পরিক বাদে) প্রক্রিয়াগুলি যা থ্রেডকে একচেটিয়াভাবে কোনও ভেরিয়েবল বা কোডের ব্লকের নিয়ন্ত্রণ অর্জন করতে দেয়, অন্যান্য থ্রেডগুলিও একই মুটেক্স অর্জন করার চেষ্টা করে কিনা তা অপেক্ষা করতে বাধ্য করে। মালিকানাধীন থ্রেড একবার মিউটেক্স প্রকাশ করলে, অন্য একটি থ্রেড ঘুরে ঘুরে মিটেক্সটি অর্জন করতে পারে।

সংযোজন (জুলাই 2016)

একটি বস্তুর উপর সিঙ্ক্রোনাইজেশন ঘটে । এর অর্থ একটি শ্রেণীর সিঙ্ক্রোনাইজড পদ্ধতিতে thisকল করা কলটির অবজেক্টটিকে লক করে দেবে । স্ট্যাটিক সিঙ্ক্রোনাইজড পদ্ধতিগুলি Classবস্তুটি নিজেই লক হয়ে যাবে।

একইভাবে, একটি সিঙ্ক্রোনাইজড ব্লকে প্রবেশের thisজন্য পদ্ধতির অবজেক্টটি লক করা দরকার ।

এর অর্থ হ'ল একটি সিঙ্ক্রোনাইজড পদ্ধতি (বা ব্লক) একই সাথে একাধিক থ্রেডে কার্যকর করা যেতে পারে যদি তারা বিভিন্ন বস্তুতে লক করে থাকে তবে কেবলমাত্র একটি থ্রেড কোনও নির্দিষ্ট সিঙ্কেল অবজেক্টের জন্য একসাথে একটি সিঙ্ক্রোনাইজড পদ্ধতি (বা ব্লক) চালাতে পারে ।


25

উদ্বায়ী:

volatileএকটি কীওয়ার্ড। volatileসমস্ত থ্রেডকে ক্যাশের পরিবর্তে মূল মেমরি থেকে পরিবর্তনশীলটির সর্বশেষ মান পেতে বাধ্য করে forces উদ্বায়ী ভেরিয়েবলগুলি অ্যাক্সেস করার জন্য কোনও লকিংয়ের প্রয়োজন নেই। সমস্ত থ্রেড একই সাথে অস্থায়ী পরিবর্তনশীল মান অ্যাক্সেস করতে পারে।

volatileভেরিয়েবলগুলি ব্যবহার করে মেমোরি ধারাবাহিকতা ত্রুটির ঝুঁকি হ্রাস করে, কারণ কোনও অস্থির ভেরিয়েবলের কোনও লেখাই সেই একই ভেরিয়েবলের পরবর্তী পাঠগুলির সাথে ঘটে যাওয়া সম্পর্ক স্থাপন করে।

এর অর্থ হ'ল কোনও volatileভেরিয়েবলের পরিবর্তনগুলি সর্বদা অন্যান্য থ্রেডে দৃশ্যমান । সর্বোপরি এর অর্থ হ'ল যখন কোনও থ্রেড একটি volatileচলক পড়বে তখন এটি কেবলমাত্র অস্থিরতমের সর্বশেষ পরিবর্তনটিই নয়, কোডটির পার্শ্ব প্রতিক্রিয়াও দেখেছিল যা পরিবর্তনের দিকে নিয়েছিল

কখন ব্যবহার করবেন: একটি থ্রেড ডেটা পরিবর্তন করে এবং অন্যান্য থ্রেডে ডেটার সর্বশেষ মান পড়তে হয়। অন্যান্য থ্রেড কিছু পদক্ষেপ নেবে তবে তারা ডেটা আপডেট করবে না

AtomicXXX:

AtomicXXXক্লাসগুলি একক ভেরিয়েবলগুলিতে লক-ফ্রি থ্রেড-নিরাপদ প্রোগ্রামিং সমর্থন করে। এই AtomicXXXশ্রেণিগুলি (যেমন AtomicInteger) একাধিক থ্রেডে অ্যাক্সেস করা অস্থায়ী ভেরিয়েবলগুলির পরিবর্তনের মেমোরি অসঙ্গতি ত্রুটিগুলি / পার্শ্ব প্রতিক্রিয়াগুলি সমাধান করে।

কখন ব্যবহার করবেন: একাধিক থ্রেড ডেটা পড়তে এবং সংশোধন করতে পারে।

সিঙ্ক্রোনাইজ হয়েছে:

synchronizedকোনও পদ্ধতি বা কোড ব্লককে রক্ষা করতে ব্যবহৃত কীওয়ার্ড। সিঙ্ক্রোনাইজড হিসাবে পদ্ধতি তৈরির দুটি প্রভাব রয়েছে:

  1. প্রথমত, synchronizedএকই বস্তুটিতে ইন্টারলিভের জন্য দুটি পদ্ধতির অনুরোধ সম্ভব নয় । যখন একটি থ্রেড synchronizedকোনও অবজেক্টের জন্য কোনও পদ্ধতি চালায়, অন্য সমস্ত থ্রেড যা synchronizedএকই অবজেক্ট ব্লকের জন্য পদ্ধতিগুলি আহ্বান করে (কার্যকর স্থগিত করে) যতক্ষণ না প্রথম থ্রেডটি অবজেক্টের সাথে করা হয়।

  2. দ্বিতীয়ত, যখন কোনও synchronizedপদ্ধতিটি প্রস্থান করে, এটি স্বয়ংক্রিয়ভাবে synchronizedএকই অবজেক্টের জন্য কোনও পদ্ধতির পরবর্তী অনুরোধের সাথে একটি ঘটনার আগে সম্পর্ক স্থাপন করে । এটি গ্যারান্টি দেয় যে অবজেক্টের স্থিতিতে পরিবর্তনগুলি সমস্ত থ্রেডে দৃশ্যমান।

কখন ব্যবহার করবেন: একাধিক থ্রেড ডেটা পড়তে এবং সংশোধন করতে পারে। আপনার ব্যবসায়ের যুক্তি কেবল ডেটা আপডেট করে না তবে পারমাণবিক ক্রিয়াকলাপ চালায়

AtomicXXXvolatile + synchronizedবাস্তবায়ন ভিন্ন হলেও এর সমতুল্য । ভেরিয়েবল + পদ্ধতি AmtomicXXXপ্রসারিত করে কিন্তু সিঙ্ক্রোনাইজেশন ব্যবহার করে না।volatilecompareAndSet

সম্পর্কিত এসই প্রশ্ন:

জাভাতে অস্থির এবং সিঙ্ক্রোনাইজের মধ্যে পার্থক্য

ভোল্টাইল বুলেটিয়ান বনাম অ্যাটমিকবুলিয়ান

পড়তে ভাল নিবন্ধ: (উপরের বিষয়বস্তু এই ডকুমেন্টেশন পৃষ্ঠাগুলি থেকে নেওয়া হয়)

https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html

https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/atomic/package-summary.html


2
এটি হ'ল প্রথম উত্তর যা বাস্তবে বর্ণিত কীওয়ার্ড / বৈশিষ্ট্যগুলির পূর্বে শব্দার্থবিজ্ঞানের কথা উল্লেখ করে যা কোডগুলি কার্যকরভাবে কীভাবে প্রভাবিত করে তা বোঝার জন্য এটি গুরুত্বপূর্ণ। উচ্চতর ভোট দেওয়া উত্তরগুলি এই দিকটি মিস করে।
jhyot

5

আমি জানি যে একই সাথে দুটি থ্রেড সিঙ্ক্রোনাইজ ব্লকে প্রবেশ করতে পারে না

দুটি থ্রেড একই বস্তুতে দু'বার সিঙ্ক্রোনাইজড ব্লক প্রবেশ করতে পারে না। এর অর্থ হ'ল দুটি থ্রেড বিভিন্ন বস্তুতে একই ব্লকে প্রবেশ করতে পারে। এই বিভ্রান্তি এই জাতীয় কোড হতে পারে।

private Integer i = 0;

synchronized(i) {
   i++;
}

এটি প্রত্যাশার মতো আচরণ করবে না কারণ এটি প্রতিবার একটি ভিন্ন অবজেক্টে লক হয়ে থাকতে পারে।

যদি এটি কীভাবে এই পারমাণবিক.স্রোমেন্টএন্ডগেট () সিঙ্ক্রোনাইজ না করে কাজ করে তার চেয়ে সত্য যদি ?? এবং থ্রেড নিরাপদ ??

হ্যাঁ. এটি থ্রেড সুরক্ষা অর্জন করতে লকিং ব্যবহার করে না।

তারা কীভাবে আরও বিশদে কাজ করে তা যদি আপনি জানতে চান তবে আপনি তাদের জন্য কোডটি পড়তে পারেন।

এবং অভ্যন্তরীণ পড়া এবং ভোল্টাইল ভেরিয়েবল / পারমাণবিক পরিবর্তনশীল লেখার মধ্যে পার্থক্য কি ??

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

আমি কিছু নিবন্ধে পড়েছি যে থ্রেডে স্থানীয় ভেরিয়েবলের অনুলিপিটি কী তা ??

আমি কেবল ধরে নিতে পারি যে এটি প্রতিটি সিপিইউর মেমরির নিজস্ব ক্যাশেড ভিউ রয়েছে যা প্রতিটি অন্যান্য সিপিইউ থেকে পৃথক হতে পারে to আপনার সিপিইউতে ডেটা সম্পর্কে ধারাবাহিক দৃষ্টিভঙ্গি রয়েছে তা নিশ্চিত করতে আপনার থ্রেড সুরক্ষা কৌশলগুলি ব্যবহার করতে হবে।

এটি কেবল তখনই সমস্যা হয় যখন মেমরিটি ভাগ করা হয় কমপক্ষে একটি থ্রেড এটি আপডেট করে।


@ অনিকেত ঠাকুর কি আপনি এ সম্পর্কে নিশ্চিত? পূর্ণসংখ্যা পরিবর্তনযোগ্য। সুতরাং আমি ++ সম্ভবত ইনট মানটি আনবক্স করব, এটি বাড়িয়ে তুলব এবং তারপরে একটি নতুন পূর্ণসংখ্যা তৈরি করব যা পূর্বের মতো একই উদাহরণ নয়। আমি চূড়ান্ত করার চেষ্টা করুন এবং আই ++ কল করার সময় আপনি সংকলক ত্রুটি পাবেন।
fuemf5

2

সিঙ্ক্রোনাইজ বনাম পারমাণবিক বনাম অস্থির:

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

আমি যদি কিছু মিস করি তবে দয়া করে আমাকে সংশোধন করুন।


1

একটি অস্থির + সিঙ্ক্রোনাইজেশন হ'ল একটি অপারেশন (বিবৃতি) পুরোপুরি পারমাণবিক হওয়ার জন্য বোকা প্রমাণ সমাধান যা সিপিইউতে একাধিক নির্দেশাবলী অন্তর্ভুক্ত করে।

উদাহরণস্বরূপ বলুন: উদ্বায়ী int i = 2; i ++, যা আমি = i + 1 ছাড়া কিছুই নয়; যা এই বিবৃতিটি কার্যকর করার পরে মেমোরিতে 3 মান হিসাবে তৈরি করে। এর মধ্যে রয়েছে মেমোরি থেকে বিদ্যমান মান পড়ার জন্য (যা 2), সিপিইউ সংগ্রহকারীর রেজিষ্টারে লোড করুন এবং বিদ্যমান মানকে এক (2 + 1 = 3) দিয়ে বাড়িয়ে অঙ্কের সাথে গণনা করুন এবং তারপরে বর্ধিত মানটি আবার লিখুন স্মৃতি ফিরে। এই অপারেশনগুলি যথেষ্ট পরিমাণে পারমাণবিক নয় যদিও মানটি আমার হয় অস্থির। আমি কেবল অস্থির হয়েই গ্যারান্টি দিচ্ছি যে মেমরি থেকে একটি পড়া পড়া / লেখাই পারমাণবিক এবং বহুগুণ সহ নয়। সুতরাং, এটিকে বোকা প্রমাণের পরমাণু বিবৃতি হিসাবে ধরে রাখতে আমাদের ++ এর আশেপাশেও সুসংগত করা দরকার। একটি বিবৃতিতে একাধিক বিবৃতি অন্তর্ভুক্ত রয়েছে এ বিষয়টি মনে রাখবেন।

আশা করি ব্যাখ্যাটি যথেষ্ট পরিষ্কার হয়েছে।


1

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

পারমাণবিক অপারেশনগুলি অন্যান্য ক্রিয়াকলাপের হস্তক্ষেপ ছাড়াই একটি একক কার্যে সম্পাদিত হয়। তথ্যের অসঙ্গতি এড়াতে বহু-থ্রেডযুক্ত পরিবেশে পারমাণবিক ক্রিয়াকলাপ প্রয়োজনীয়তা।

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