স্থির শ্রেণীর ভেরিয়েবলগুলি সংশোধন না করা হলে কী অ-সিঙ্ক্রোনাইজ করা স্ট্যাটিক পদ্ধতিগুলি থ্রেড নিরাপদ?


145

আপনি একটি স্ট্যাটিক পদ্ধতি যা আছে আমি ভাবছিলাম না সিঙ্ক্রোনাইজ, কিন্তু আছে না কোনো স্ট্যাটিক ভেরিয়েবল পরিবর্তন এটা থ্রেড-নিরাপদ? পদ্ধতিটি যদি এর ভিতরে স্থানীয় ভেরিয়েবল তৈরি করে তবে কী হবে? উদাহরণস্বরূপ, নিম্নলিখিত কোড থ্রেড-নিরাপদ?

public static String[] makeStringArray( String a, String b ){
    return new String[]{ a, b };
}

সুতরাং যদি আমার কাছে দুটি থ্রেড থাকে যা নিয়মিতভাবে এবং একযোগে কল করে, একটি কুকুরের সাথে ("গ্রেট ডেন" এবং "ষাঁড় কুকুর" বলে) এবং অন্যটি বিড়াল সহ ("পার্সিয়ান" এবং "সামিয়া" বলে) আমি কি কখনও বিড়াল এবং কুকুর পেতে পারি? একই অ্যারে? বা বিড়াল এবং কুকুর কখনও একই পদ্ধতিতে একই অনুরোধের ভিতরে থাকতে পারে না?


এই ইস্যুতে আর একটি থ্রেড: stackoverflow.com/questions/8015797/…
象 嘉

2
এটি একটি আলাদা প্রশ্ন, স্থির পদ্ধতির প্রার্থনা থ্রেড নিরাপদ কিনা, অ্যারেগুলি কিনা তা নয়।
টানা স্লেজগাড়ির

উত্তর:


212

এই পদ্ধতিটি 100% থ্রেড নিরাপদ, এটি না থাকলেও এটি হবে static। থ্রেড-সুরক্ষার সাথে সমস্যা দেখা দেয় যখন আপনার থ্রেডগুলির মধ্যে ডেটা ভাগ করা দরকার - আপনাকে অবশ্যই পারমাণবিকতা, দৃশ্যমানতা ইত্যাদির যত্ন নিতে হবে must

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

অপরিবর্তনীয় বস্তু ( Stringএই ক্ষেত্রে) থ্রেড-নিরাপদ কারণ একবার তৈরি হয়ে গেলে সেগুলি পরিবর্তন করা যায় না এবং সমস্ত থ্রেড একই মান দেখে। অন্যদিকে যদি পদ্ধতিটি গ্রহণ করা হয় (পরিবর্তনযোগ্য) Dateআপনার সমস্যা হতে পারে। দুটি থ্রেড একই সাথে একই পদার্থের সংশোধন করতে পারে, যা বর্ণের পরিস্থিতি এবং দৃশ্যমানতার সমস্যা তৈরি করে।


4
সঠিক উত্তর. পদ্ধতি স্তরের ভেরিয়েবলগুলি প্রতিটি থ্রেড এক্সিকিউশন স্ট্যাকে প্রতিলিপি করা হয়।
সিড

প্রযুক্তিগতভাবে পদ্ধতিটি অন্তর্ভুক্ত করতে হবে এবং পরামিতিগুলি সিপিইউ নিবন্ধভুক্ত হবে। তবুও উত্তরটি সঠিক
মার্চকে বেটসেস করুন

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

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

আমি যদি পদ্ধতিতে ক্লাস অবজেক্ট পাস করি? স্ট্যাক বা গাদা মধ্যে পরিবর্তনযোগ্য হবে?
গ্রেপ

28

কোনও পদ্ধতি কেবল তখন থ্রেড-অনিরাপদ হতে পারে যখন এটি কিছু ভাগ করা স্থিতি পরিবর্তন করে। এটি স্থির হোক বা না হোক অপ্রাসঙ্গিক।


3
@ কনরাড_গারাস এখানে প্রশ্ন স্থানীয় ভেরিয়েবলগুলি ভাগ করে নেওয়ার রাষ্ট্র গঠন করেছে কিনা, বা স্ট্যাটিক পদ্ধতির স্ট্যাক প্রতি থ্রেডের ভিত্তিতে বা ভাগ করে নেওয়া হয়েছে কিনা সেদিকেই প্রশ্নটি ছিল।
টানা স্লেজগাড়ির

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

12

ফাংশনটি পুরোপুরি থ্রেড নিরাপদ।

আপনি যদি এটির জন্য চিন্তা করেন ... ধরে নিবেন যদি এটি আলাদা হত তবে কি ঘটবে। প্রতিটি সাধারণ ক্রিয়াকলাপের সিঙ্ক্রোনাইজ না করা হলে থ্রেডিংয়ের সমস্যা হবে, সুতরাং জেডিকে সমস্ত এপিআই ফাংশন সিঙ্ক্রোনাইজ করতে হবে, কারণ তারা সম্ভবত একাধিক থ্রেড দ্বারা ডাকা হতে পারে। এবং বেশিরভাগ সময় অ্যাপ্লিকেশনটি কিছু এপিআই ব্যবহার করছে তাই বহুবিধ অ্যাপস কার্যকরভাবে অসম্ভব।

এটি সম্পর্কে ভাবা খুব হাস্যকর, সুতরাং কেবল আপনার জন্য: সমস্যাগুলির কারণের কোনও স্পষ্ট কারণ থাকলে পদ্ধতিগুলি থ্রেডসেফ নয় not আমার ফাংশনে একাধিক থ্রেড থাকলে কী হবে তা নিয়ে সর্বদা চিন্তা করার চেষ্টা করুন এবং যদি আপনার স্টেপ-ডিবাগার থাকে এবং এক ধাপ পরে প্রথম দিকে এগিয়ে যান তবে দ্বিতীয় থ্রেড ... সম্ভবত দ্বিতীয়টি আবার ... সমস্যা আছে? যদি আপনি এটির সন্ধান করেন তবে এটি থ্রেডটি নিরাপদ নয়।

দয়া করে সচেতন হন, জাভা 1.5 সংগ্রহের ক্লাসগুলির বেশিরভাগ থ্র্যান্ডসেফ নয়, যেখানে কনকেনেন্টার হ্যাশম্যাপের মতো বর্ণিত রয়েছে except

এবং যদি আপনি সত্যিই এটিতে ডুব দিতে চান তবে অস্থির কীওয়ার্ডটি এবং এর সমস্ত পার্শ্ব প্রতিক্রিয়াগুলি ঘনিষ্ঠভাবে দেখুন। সেমাফোর () এবং লক () ক্লাস এবং জাভা.ইটি.এল.কন্ট্রন্টে তাদের বন্ধুদের দেখুন। ক্লাসের চারপাশে সমস্ত এপিআই ডক্স পড়ুন। এটি শিখতে এবং সন্তুষ্ট করার পক্ষেও মূল্যবান।

এই অত্যধিক বিস্তৃত উত্তরের জন্য দুঃখিত।


2
"যদি আপনি এটির বিষয়ে চিন্তা করেন ... ধরে নিন যে এটি যদি আলাদা হয় তবে কি হবে। থ্রেড। " ভাল যুক্তি!
টানা স্লেজগাড়ির

1

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

volatileসিঙ্ক্রোনাইজড ইনস্ট্যান্স পদ্ধতিগুলির সাথে কীওয়ার্ডটি ব্যবহার করুন গ্যারান্টি দিবে যে প্রতিটি থ্রেডের ভাগ করা ডেটার নিজস্ব কপি রয়েছে এবং কোনও পঠন / লেখার থ্রেডের মধ্যে ফাঁস হবে না।


0

স্ট্রিং অবজেক্টগুলি অপরিবর্তনীয় হওয়ায় উপরের থ্রেড-নিরাপদ দৃশ্যের আরেকটি কারণ। পরিবর্তে যদি পরিবর্তনীয় অবজেক্ট ব্যবহার করা হয় (বলুন MakeMutableArray ..) তবে অবশ্যই থ্রেড-সুরক্ষা ভেঙে যাবে।


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

কেন এই প্রতিক্রিয়া নিম্ন ভোট দেওয়া হয়েছিল? অন্য উত্তরগুলির দ্বারা অবদান নেই এমন বিষয়টি হ'ল পরিবর্তনের বিষয়টি অন্তঃসীমা বা আবদ্ধ হতে পারে। আপনি যদি কোনও পরিবর্তনীয় ফিরিয়ে দেন, তবে আপনি থ্রেডসেফ নন। মন্তব্যটি মতামতের পরামর্শ অনুসারে প্রশ্নটি তার প্রশ্নটিকে সঙ্কীর্ণভাবে উত্থাপন করে না; কোড নমুনার পরে বর্ধিত প্রশ্ন কোডে প্রকাশ করা যেতে পারে, সম্ভবত ইউনিট পরীক্ষা হিসাবে। তবে সহকর্মীদের বোঝানোর চেষ্টা করার সাথে আমি সহানুভূতি প্রকাশ করি। "তারা আমাকে, বা আমার পরীক্ষার কোড বা জোশ ব্লচকে বিশ্বাস করে না, তবে তারা এসও-তে একটি উত্তর গ্রহণ করবে" "
som-snytt
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.