থ্রেডসেফ বলতে কী বোঝায়?


123

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

তবে তবুও কেন আমি অতিরিক্ত সমস্ত কোড প্রয়োজনীয় তা আমি যথেষ্ট বুঝতে পারি নি।

আপডেট: আমি যদি চেক করি তবে কি আমি কোনও গুরুতর সমস্যায় পড়ব?

Controls.CheckForIllegalCrossThread..blah =true

5
সাধারণত, "থ্রেড সেফ" অর্থ এই শব্দটি ব্যবহার করা ব্যক্তি যার অর্থ মনে করে, অন্তত সেই ব্যক্তির পক্ষে। যেমনটি, এটি খুব দরকারী ভাষা নির্মাণ নয় - থ্রেড কোডের আচরণের কথা বলার সময় আপনাকে অনেক বেশি নির্দিষ্ট হতে হবে।


@ ডেভ দুঃখিত আমি অনুসন্ধানের চেষ্টা করেছি, কিন্তু ছেড়ে দিয়েছি ... যাইহোক ধন্যবাদ ..
বিবেক বার্নার্ড

1
একটি কোড দেখা দেয় নাRace-Condition
মুহাম্মদ বাবর

উত্তর:


121

এরিক লিপার্টের একটি দুর্দান্ত ব্লগ পোস্ট রয়েছে যার নাম আপনি "থ্রেডকে নিরাপদ" বলছেন? উইকিপিডিয়ায় প্রাপ্ত থ্রেড সুরক্ষার সংজ্ঞা সম্পর্কে।

লিঙ্কগুলি থেকে নেওয়া 3 টি গুরুত্বপূর্ণ জিনিস:

"একাধিক থ্রেড দ্বারা একযোগে কার্যকর করার সময় যদি কোডটির একটি অংশটি থ্রেড-সেফ হয়।"

"বিশেষত, একই ভাগ করা ডেটা অ্যাক্সেস করার জন্য এটি অবশ্যই একাধিক থ্রেডের প্রয়োজনীয়তা পূরণ করবে, ..."

"... এবং যে কোনও সময় একটি মাত্র থ্রেড দ্বারা অ্যাক্সেস করার জন্য ভাগ করা ডেটা ভাগ করার প্রয়োজন” "

অবশ্যই একটি পড়ার মূল্য!


24
ভবিষ্যতে যে কোনও সময় খারাপ হতে পারে বলে দয়া করে কেবলমাত্র উত্তরগুলি এড়িয়ে যান।
akhil_mittal


106

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


11
একে সিঙ্ক্রোনাইজেশন বলা হয়। রাইট?
জাভাটেকনিকাল

3
হ্যাঁ. ভাগ করে নেওয়া সংস্থানটিতে অ্যাক্সেসের জন্য অপেক্ষা করতে বিভিন্ন থ্রেডকে বাধ্য করা সিঙ্ক্রোনাইজেশনের মাধ্যমে সম্পন্ন করা যায়।
ভিনসেন্ট রামধনি

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

ইহা একই জিনিস. কোড থ্রেডসেফ কী তৈরি করে তার উদাহরণ হিসাবে আমি একটি সাধারণ প্রক্রিয়াটির পরামর্শ দিচ্ছি। একই কোড চলমান একাধিক থ্রেডের একে অপরের সাথে হস্তক্ষেপ করা উচিত না যদিও ব্যবহৃত মেকানিজম নির্বিশেষে।
ভিনসেন্ট রামধনি

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

18

উইকিপিডিয়ায় থ্রেড সুরক্ষা সম্পর্কিত একটি নিবন্ধ রয়েছে।

এই সংজ্ঞা পৃষ্ঠাটি (আপনাকে একটি বিজ্ঞাপন এড়িয়ে যেতে হবে - দুঃখিত) এটি এটিকে সংজ্ঞায়িত করে:

কম্পিউটার প্রোগ্রামিংয়ে থ্রেড-সেফ একটি প্রোগ্রাম অংশ বা রুটিন বর্ণনা করে যা থ্রেডগুলির মধ্যে অযাচিত ইন্টারঅ্যাকশন ছাড়াই একাধিক প্রোগ্রামিং থ্রেড থেকে কল করা যেতে পারে।

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

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

যেহেতু এই থ্রেডগুলিতে প্রায়শই সাধারণ ক্রিয়াগুলি সম্পাদন করা প্রয়োজন - ডিস্ক আই / ও, স্ক্রিনে ফলাফল আউটপুট আনা ইত্যাদি - কোডের এই অংশগুলি এমনভাবে লিখতে হবে যেগুলি একাধিক থ্রেড থেকে ডেকে ডাকা হ্যান্ডেল করতে পারে, প্রায়শই একই সময়. এতে অন্তর্ভুক্ত থাকবে যেমন:

  • ডেটা অনুলিপি নিয়ে কাজ করা
  • সমালোচনামূলক কোডটির চারপাশে লক যুক্ত করা

8

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

নিম্নলিখিত পদ্ধতিটি বিবেচনা করুন:

private int myInt = 0;
public int AddOne()
{
    int tmp = myInt;
    tmp = tmp + 1;
    myInt = tmp;
    return tmp;
}

এখন থ্রেড এ এবং থ্রেড বি উভয়ই অ্যাডঅন () সম্পাদন করতে চাই। তবে এ প্রথমে শুরু হয় এবং মাই আইন্ট (0) এর মান tmp এ পড়ে। এখন কোনও কারণে শিডিয়ুলার থ্রেড এ থামিয়ে স্থির করে এবং থ্রেড বি থ্রেডে এক্সিকিউশন স্থগিত করে থ্রেড বি এখন মাই আইন্টের মান (এখনও 0) এর নিজস্ব ভেরিয়েবল টিএমপি পড়ে reads থ্রেড বি পুরো পদ্ধতিটি শেষ করে, তাই শেষ পর্যন্ত আমার আইটেন্ট = ১ এবং 1 ফিরে আসে। এখন আবার থ্রেড এ এর ​​পালা। থ্রেড এ অবিরত রয়েছে। এবং টিএমপিতে 1 যুক্ত করে (থ্রেড এ থ্রেডের জন্য টিএমপি 0 ছিল)। এবং তারপরে এই মানটি myInt এ সংরক্ষণ করে। myInt আবার 1।

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

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


যদি পদ্ধতি অ্যাডঅনকে দুইবার ডাকা হত
পিএস

6

সাধারণ বিশ্বের জন্য বাস্তব বিশ্বের উদাহরণ

ধরা যাক আপনার ইন্টারনেট এবং মোবাইল ব্যাংকিং সহ একটি ব্যাংক অ্যাকাউন্ট রয়েছে এবং আপনার অ্যাকাউন্টে কেবলমাত্র 10 ডলার রয়েছে। আপনি মোবাইল ব্যাংকিং ব্যবহার করে অন্য অ্যাকাউন্টে স্থানান্তর ব্যালান্স সম্পাদন করেছেন এবং এরই মধ্যে আপনি একই ব্যাংক অ্যাকাউন্টটি ব্যবহার করে অনলাইনে কেনাকাটা করেছেন shopping যদি এই ব্যাংক অ্যাকাউন্টটি থ্রেডসেফ না হয়, তবে ব্যাংক আপনাকে একই সময়ে দুটি লেনদেন করার অনুমতি দেয় এবং তারপরে ব্যাংক দেউলিয়া হয়ে যাবে।

থ্রেডসফের অর্থ হ'ল যদি একই সাথে একাধিক থ্রেড বস্তুটি অ্যাক্সেস করার চেষ্টা করে তবে কোনও বস্তুর অবস্থা পরিবর্তন হয় না।


5

"অনুশীলনে জাভা কনকুরান্সি" বইটি থেকে আপনি আরও ব্যাখ্যা পেতে পারেন:

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


4

একটি মডিউল থ্রেড-সেফ হয় যদি এটি গ্যারান্টি দেয় যে এটি বহু-থ্রেডযুক্ত এবং সম্মতিযুক্ত ব্যবহারের মুখে এর আক্রমণকারীদের বজায় রাখতে পারে।

এখানে, একটি মডিউল একটি ডেটা-কাঠামো, শ্রেণি, অবজেক্ট, পদ্ধতি / পদ্ধতি বা ফাংশন হতে পারে। মূলত কোড এবং সম্পর্কিত ডেটার টুকরো টুকরো।

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

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

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


3

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

আপনি উন্নত সম্মতিযুক্ত API ব্যবহার করে থ্রেড সুরক্ষা অর্জন করতে পারেন। এই ডকুমেন্টেশন পৃষ্ঠাটি থ্রেড সুরক্ষা অর্জনের জন্য ভাল প্রোগ্রামিং কনস্ট্রাক্টস সরবরাহ করে।

লক অবজেক্টস লকিং আইডিয়ামগুলিকে সমর্থন করে যা অনেকগুলি সমবর্তী অ্যাপ্লিকেশনকে সহজতর করে।

এক্সিকিউটাররা থ্রেড চালু এবং পরিচালনা করার জন্য একটি উচ্চ-স্তরের এপিআই সংজ্ঞায়িত করে। Java.util.concurrent দ্বারা প্রদত্ত এক্সিকিউটর বাস্তবায়ন বৃহত-স্কেল অ্যাপ্লিকেশনগুলির জন্য উপযুক্ত থ্রেড পুল পরিচালনা সরবরাহ করে।

সমকালীন সংগ্রহগুলি বড় আকারের ডেটা সংগ্রহগুলি পরিচালনা করা সহজ করে তোলে এবং সিঙ্ক্রোনাইজেশনের প্রয়োজনীয়তা ব্যাপকভাবে হ্রাস করতে পারে।

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

থ্রেডলোক্যালআর্যান্ডম ( জেডিকে in এ) একাধিক থ্রেড থেকে সিউডোরান্ডম সংখ্যার দক্ষ জেনারেশন সরবরাহ করে।

পড়ুন java.util.concurrent এবং java.util.concurrent.atomic অন্যান্য প্রোগ্রামিং নির্মান জন্য খুব প্যাকেজ।


1

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

সাধারণ উইনফোর্ডস অনুশীলনের মধ্যে একটি একক থ্রেড থাকে যা আপনার সমস্ত ইউআই কাজের জন্য উত্সর্গীকৃত।


1

আমি সাধারণত http://en.wikedia.org/wiki/Reentrancy_%28 কমপুটিং ৯৯৯ এর ধারণাটি পাই যা আমি সাধারণত অনিরাপদ থ্রেডিং হিসাবে মনে করি যা তখন কোনও পদ্ধতিতে থাকে এবং বৈশ্বিক চলকের মতো পার্শ্ব প্রতিক্রিয়ার উপর নির্ভর করে।

উদাহরণস্বরূপ, আমি কোডটি দেখেছি যে ফ্লোটিং পয়েন্ট সংখ্যাগুলিকে স্ট্রিংয়ে ফর্ম্যাট করে, এর মধ্যে দুটি যদি বিভিন্ন থ্রেডে চালিত হয় তবে দশমিক সেপারেটরের গ্লোবাল মান স্থায়ীভাবে পরিবর্তিত হতে পারে '' '

//built in global set to locale specific value (here a comma)
decimalSeparator = ','

function FormatDot(value : real):
    //save the current decimal character
    temp = decimalSeparator

    //set the global value to be 
    decimalSeparator = '.'

    //format() uses decimalSeparator behind the scenes
    result = format(value)

    //Put the original value back
    decimalSeparator = temp

-2

থ্রেড সুরক্ষা বুঝতে, নীচের বিভাগগুলি পড়ুন :

4.3.1। উদাহরণ: ডেলিগেশন ব্যবহার করে যানবাহন ট্র্যাকার

প্রতিনিধি দলের আরও উল্লেখযোগ্য উদাহরণ হিসাবে, চলুন যানবাহন ট্র্যাকারের একটি সংস্করণ তৈরি করুন যা একটি থ্রেড-নিরাপদ শ্রেণিতে প্রতিনিধিত্ব করে। আমরা অবস্থানগুলিতে একটি মানচিত্রে সংরক্ষণ করি, সুতরাং আমরা একটি থ্রেড-নিরাপদ মানচিত্রের প্রয়োগ দিয়ে শুরু করি ConcurrentHashMap। আমরা MutablePointলিস্টিং ৪.6-তে প্রদর্শিত পরিবর্তে স্থাবর পয়েন্ট শ্রেণি ব্যবহার করে অবস্থানটি সঞ্চয় করি store

তালিকা 4.6। DelegatingVehicleTracker দ্বারা ব্যবহৃত অপরিবর্তনীয় পয়েন্ট শ্রেণি।

 class Point{
  public final int x, y;

  public Point() {
        this.x=0; this.y=0;
    }

  public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

}

Pointথ্রেড-নিরাপদ কারণ এটি পরিবর্তনযোগ্য। অপরিবর্তনীয় মানগুলি অবাধে ভাগ করে নেওয়া এবং প্রকাশ করা যেতে পারে, সুতরাং সেগুলি ফেরত দেওয়ার সময় আমাদের আর কপি করার দরকার নেই।

DelegatingVehicleTrackerতালিকাভুক্ত 4.7 কোনও সুস্পষ্ট সিঙ্ক্রোনাইজেশন ব্যবহার করে না; রাষ্ট্রের সমস্ত অ্যাক্সেস পরিচালনা করে ConcurrentHashMapএবং মানচিত্রের সমস্ত কী এবং মান অপরিবর্তনীয়।

তালিকা 4.7। একটি সাম্প্রতিক হ্যাশম্যাপে থ্রেড সুরক্ষা প্রদান করা।

  public class DelegatingVehicleTracker {

  private final ConcurrentMap<String, Point> locations;
    private final Map<String, Point> unmodifiableMap;

  public DelegatingVehicleTracker(Map<String, Point> points) {
        this.locations = new ConcurrentHashMap<String, Point>(points);
        this.unmodifiableMap = Collections.unmodifiableMap(locations);
    }

  public Map<String, Point> getLocations(){
        return this.unmodifiableMap; // User cannot update point(x,y) as Point is immutable
    }

  public Point getLocation(String id) {
        return locations.get(id);
    }

  public void setLocation(String id, int x, int y) {
        if(locations.replace(id, new Point(x, y)) == null) {
             throw new IllegalArgumentException("invalid vehicle name: " + id);
        }
    }

}

আমরা যদি MutablePointপয়েন্টের পরিবর্তে আসল ক্লাসটি ব্যবহার করে থাকি, তবে getLocationsথ্রেড-নিরাপদ নয় এমন পরিবর্তনীয় অবস্থার একটি রেফারেন্স প্রকাশ করে আমরা এনক্যাপসুলেশনটি ভেঙে ফেলি। লক্ষ্য করুন যে আমরা গাড়ির ট্র্যাকার শ্রেণির আচরণ কিছুটা পরিবর্তন করেছি; মনিটর সংস্করণটি অবস্থানগুলির একটি স্ন্যাপশট ফেরত দেওয়ার সময়, প্রতিনিধি সংস্করণটি গাড়ির অবস্থানগুলির একটি অবিশ্বাস্য তবে "লাইভ" দৃশ্য প্রদান করে। এর অর্থ হ'ল যদি থ্রেড এ কল getLocationsএবং থ্রেড বি পরে কিছু পয়েন্টের অবস্থান পরিবর্তন করে তবে সেই পরিবর্তনগুলি মানচিত্রে থ্রেড এ এ ফিরে আসে are

4.3.2। ইন্ডিপেন্ডেন্ট স্টেট ভেরিয়েবলস

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

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

তালিকা 4.9। একাধিক অন্তর্নিহিত স্টেট ভেরিয়েবলগুলিতে থ্রেড সুরক্ষা প্রদান করা।

public class VisualComponent {
    private final List<KeyListener> keyListeners 
                                        = new CopyOnWriteArrayList<KeyListener>();
    private final List<MouseListener> mouseListeners 
                                        = new CopyOnWriteArrayList<MouseListener>();

  public void addKeyListener(KeyListener listener) {
        keyListeners.add(listener);
    }

  public void addMouseListener(MouseListener listener) {
        mouseListeners.add(listener);
    }

  public void removeKeyListener(KeyListener listener) {
        keyListeners.remove(listener);
    }

  public void removeMouseListener(MouseListener listener) {
        mouseListeners.remove(listener);
    }

}

VisualComponentCopyOnWriteArrayListপ্রতিটি শ্রোতার তালিকা সংরক্ষণ করতে একটি ব্যবহার করে ; এটি একটি থ্রেড-নিরাপদ তালিকা বাস্তবায়ন শ্রোতার তালিকাগুলি পরিচালনার জন্য বিশেষত উপযোগী (বিভাগ 5.2.3 দেখুন)। প্রতিটি তালিকা থ্রেড-নিরাপদ, এবং একের সাথে অন্যের রাজ্যের সংযোজনে কোনও বাধা নেই বলে VisualComponentএর থ্রেড সুরক্ষা দায়িত্ব অন্তর্নিহিত mouseListenersএবং keyListenersঅবজেক্টগুলিকে অর্পণ করতে পারে।

4.3.3। ডেলিগেশন ব্যর্থ হলে

বেশিরভাগ যৌগিক শ্রেণিগুলির মতো সহজ নয় VisualComponent: তাদের আক্রমণকারী থাকে যা তাদের উপাদান রাষ্ট্রের পরিবর্তনশীলগুলির সাথে সম্পর্কিত। NumberRangeতালিকাতে 4.10 AtomicIntegersএর রাজ্য পরিচালনা করতে দুটি ব্যবহার করে , তবে একটি অতিরিক্ত বাধা আরোপ করে - প্রথম সংখ্যাটি দ্বিতীয়টির চেয়ে কম বা সমান।

তালিকা 4.10। সংখ্যা পরিসীমা শ্রেণি যা এর আক্রমণকারীদের পর্যাপ্তরূপে রক্ষা করে না। এটি করবেন না।

public class NumberRange {

  // INVARIANT: lower <= upper
    private final AtomicInteger lower = new AtomicInteger(0);
    private final AtomicInteger upper = new AtomicInteger(0);

  public void setLower(int i) {
        //Warning - unsafe check-then-act
        if(i > upper.get()) {
            throw new IllegalArgumentException(
                    "Can't set lower to " + i + " > upper ");
        }
        lower.set(i);
    }

  public void setUpper(int i) {
        //Warning - unsafe check-then-act
        if(i < lower.get()) {
            throw new IllegalArgumentException(
                    "Can't set upper to " + i + " < lower ");
        }
        upper.set(i);
    }

  public boolean isInRange(int i){
        return (i >= lower.get() && i <= upper.get());
    }

}

NumberRangeহয় থ্রেড-নিরাপদ নয় ; এটি আক্রমণকারীকে সংরক্ষণ করে না যা নিম্ন এবং উচ্চতরকে সীমাবদ্ধ করে। setLowerএবং setUpperপদ্ধতি এই পরিবর্তিত সম্মান করার প্রচেষ্টা, কিন্তু দুর্বল না। উভয় setLowerএবং setUpperচেক-তৎকালীন অ্যাক্ট সিকোয়েন্সগুলি হয় তবে তারা এটিকে পারমাণবিক করতে পর্যাপ্ত লকিং ব্যবহার করে না। যদি সংখ্যা পরিসীমা হ'ল (0, 10), এবং একটি থ্রেড কল করার setLower(5)সময় অন্য থ্রেড কল করবে setUpper(4), কিছু অশুভ সময় দেওয়ার সাথে সাথে উভয়ই সেটারগুলিতে চেকগুলি পাস করবে এবং উভয় পরিবর্তন প্রয়োগ করা হবে। ফলাফলটি এখন পরিসরটি ধরে রাখে (5, 4) - একটি অবৈধ রাষ্ট্র । সুতরাং অন্তর্নিহিত অ্যাটমিকআইন্টিজারগুলি থ্রেড-নিরাপদ থাকা অবস্থায়, সম্মিলিত শ্রেণিটি নয় । কারণ অন্তর্নিহিত রাষ্ট্র পরিবর্তনশীল lowerএবংupperস্বতন্ত্র নয়, NumberRangeএটির থ্রেড-নিরাপদ রাষ্ট্র পরিবর্তনশীলগুলিতে কেবল থ্রেড সুরক্ষা প্রদান করতে পারে না cannot

NumberRangeএর আক্রমণকারীদের বজায় রাখতে লক ব্যবহার করে থ্রেড-সেফ তৈরি করা যেতে পারে, যেমন একটি সাধারণ লক দিয়ে নিম্ন এবং উপরের প্রহরী রক্ষা করা। ক্লায়েন্টদের আক্রমণকারীদের বিভক্ত করা থেকে বিরত রাখতে এটিকে নিম্ন এবং উচ্চতর প্রকাশ এড়াতে হবে।

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

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

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