জাভাতে বহু-থ্রেডযুক্ত পরিবেশে স্থির পদ্ধতি আচরণ


114

একটি সাধারণ বোকা প্রশ্ন যা আমাকে বিরক্ত করে এবং মনে মনে বেশ কয়েকটি যুক্তি দেয়। আমি নীচের প্রশ্নগুলি সম্পর্কে সমস্ত সন্দেহ ফেলে দিতে চাই।

class Clstest{

    public static String testStaticMethod(String inFileStr) {

        // section 0

        // section 1

        // do something with inFileStr

        // section 2

        // section 3

        return inFileStr;

    }

}

আসুন ধরে নেওয়া যাক পাঁচটি থ্রেড প্রতিটি Clstest.testStaticMethod("arg-n")একই সাথে একটি কল চালাচ্ছে ।

থ্রেড 1 কল Clstest.testStaticMethod("arg-1")

থ্রেড 1 বিভাগ 1 এ থাকা অবস্থায় থ্রেড 2 কল করে Clstest.testStaticMethod("arg-2")

তাহলে থ্রেড 1 এর কি হবে? এটা কি ঘুমের রাজ্যে যাবে?

থ্রেড 1 যখন সুযোগ পেয়েছে তখন এটি 1 সেকশন থেকে কার্যকর করা শুরু করবে যেখানে এটি থামানো হয়েছিল?

যখন পাঁচটি থ্রেডের মধ্যে একটি Clstest.testStaticMethodএবং একই Clstest.testStaticMethodভাগ করা হয় তখন কীভাবে হয় ?

inFileStrএকাধিক থ্রেড দ্বারা প্রেরিত আদান-প্রদানের কোনও সম্ভাবনা আছে কি ?


আপনি কোন ভাষাকে টার্গেট করছেন?
gaমেগামান

3
@ ওমেগামন: এটি জাভা
নামফলারনডলক

উত্তর:


192

হান্স পাসেন্টের উত্তর ভাল। তবে আমি ভেবেছিলাম যে এই যে কেউ আসে এবং জাভাতে নতুন is এখানে যায় ..

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

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

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

দ্রষ্টব্য যে থ্রেড নিজেই কিছু করে।


3
সুতরাং, মাল্টি-কোর প্রসেসরের পরিবেশে একই কোড একই সময়ে একাধিক থ্রেড চলতে পারে তাই না? এবং একক প্রসেসর পরিবেশে একটি নির্দিষ্ট সময়টিতে কেবল একটি থ্রেড চলছে। (একাধিক থ্রেডগুলি তাদের মধ্যে সময় ভাগ করে নিয়েছে?) সুতরাং, যখন থ্রেডের সময়সূচীটি বর্তমান উত্তেজক থ্রেড (এ) থেকে থ্রেড (বি) তে সুযোগ দেয়, তখন থ্রেড (এ) যেখানে থামানো হয়েছিল সেখান থেকে পুনরায় শুরু হবে কীভাবে? মানে কীভাবে এটি পুনঃসূচনা পয়েন্টটি জানবে? এটি কি কারণ "প্রতিটি থ্রেডে কোডের একটি পয়েন্টার রয়েছে যা তারা বর্তমানে চলছে এমন বিটকে চিহ্নিত করে?" আপনি যা বলেছেন?
নামফলারানডলোক

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

সুতরাং, থ্রেডগুলি যখন তাদের স্থানীয় ক্ষেত্রের বাইরে ভেরিয়েবলগুলি ব্যবহার করে এবং আন্তঃ-থ্রেড হস্তক্ষেপ ঘটে তখন উদাহরণস্বরূপ, একটি থ্রেড তার নিজস্ব স্ট্যাকের উপর থ্যাটস ভেরিয়েবলটি (বা ভেরিয়েবলের দিকে নির্দেশক) টানানোর আগে একটি থ্রেড ভেরিয়েবলের মান আপডেট করে? এটা কি সঠিক বোঝাপড়া?
হরিজহর

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

1
@ সেলিগ যদি আমার প্রাক্তন উদাহরণের পদ্ধতিগুলির সাথে একটি ক্লাস থাকে: একটি সার্ভিস ক্লাস এবং এটি সিঙ্গলটন হয় তবে পরিষেবা ক্লাসের কোনও রাজ্য যেখানে রাষ্ট্র রাখে না তাই একসাথে উদাহরণ পদ্ধতিগুলি কার্যকর করার জন্য আমি একাধিক থ্রেড নিয়ে চিন্তা করার দরকার নেই I ক্লাসে উদাহরণ ভেরিয়েবলগুলি উপস্থিত থাকলেই উপস্থিত থাকে। আমার বোধগম্যতা কি সঠিক?
যুগ সিং

67

এটা কি ঘুমের রাজ্যে যাবে?

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

একাধিক থ্রেড দ্বারা প্রেরিত inFileStr পরিবর্তন করার কি কোনও সম্ভাবনা আছে?

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

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


3
ওহো, [জাভা] ট্যাগটি কখনও দেখেনি। খুব কাছাকাছি.
হ্যান্স প্যাস্যান্ট

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