Skill

সমান্তরাল প্রোগ্রামিং (Concurrent Programming)

Computer Science - প্রোগ্রামিং মেথডলোজি (Programming Methodologies)
161

সমান্তরাল প্রোগ্রামিং (Concurrent Programming)

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

মূল ধারণা

প্রসেস এবং থ্রেড:

  • একটি প্রসেস একটি স্বাধীন প্রোগ্রাম যা নিজস্ব মেমরি স্পেস ধারণ করে। একটি প্রসেসের ভিতরে একটি বা একাধিক থ্রেড থাকতে পারে। থ্রেডগুলি একই প্রসেসের মধ্যে চলমান কার্যকলাপের ইউনিট।

সমান্তরালতা এবং প্যারালালিজম:

  • সমান্তরালতা: বিভিন্ন কাজ একসাথে সম্পন্ন হতে পারে, কিন্তু তারা বাস্তবিকভাবে এক সময়ে চলতে নাও পারে।
  • প্যারালালিজম: বিভিন্ন কাজ একসাথে সম্পন্ন হচ্ছে এবং বাস্তবিকভাবে একসাথে চলমান।

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

  • বিভিন্ন থ্রেডের মধ্যে ডেটার সঠিকতা এবং সামঞ্জস্য বজায় রাখতে সিঙ্ক্রোনাইজেশন ব্যবহার করা হয়। সিঙ্ক্রোনাইজেশন মেকানিজম যেমন লক, সেমাফোর এবং মিউটেক্স ব্যবহার করা হয়।

উদাহরণ

নিচে Python-এর মাধ্যমে সমান্তরাল প্রোগ্রামিংয়ের একটি সাধারণ উদাহরণ দেওয়া হলো:

import threading
import time

# একটি ফাংশন যা কিছু সময় নেয়
def print_numbers():
    for i in range(5):
        print(f"Number: {i}")
        time.sleep(1)

# একটি ফাংশন যা কিছু সময় নেয়
def print_letters():
    for letter in 'abcde':
        print(f"Letter: {letter}")
        time.sleep(1)

# থ্রেড তৈরি
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_letters)

# থ্রেড শুরু
thread1.start()
thread2.start()

# প্রধান থ্রেড অপেক্ষা করে
thread1.join()
thread2.join()

print("Done!")

কাজের প্রক্রিয়া

  1. থ্রেড তৈরি: print_numbers এবং print_letters ফাংশনের জন্য দুটি থ্রেড তৈরি করা হয়।
  2. থ্রেড শুরু: start() মেথড কল করে থ্রেডগুলি চালু করা হয়।
  3. সিঙ্ক্রোনাইজেশন: join() মেথড কল করে মূল থ্রেড অপেক্ষা করে যে সমস্ত থ্রেড সম্পন্ন না হওয়া পর্যন্ত।
  4. আউটপুট: ফাংশনগুলি সমান্তরালভাবে চলতে থাকে, এবং প্রোগ্রামটি "Done!" প্রদর্শন করে যখন সব থ্রেড কাজ শেষ করে।

সুবিধা

  1. কার্যকারিতা: একাধিক প্রসেসর বা কোর ব্যবহার করে কর্মক্ষমতা বাড়ানো যায়।
  2. প্রতিক্রিয়া: ইউজার ইন্টারফেস অ্যাপ্লিকেশনে প্রতিক্রিয়া উন্নত হয়, কারণ ব্যাকগ্রাউন্ডে কাজ চলতে থাকে।
  3. সম্পদ ব্যবস্থাপনা: বিভিন্ন কাজ একসাথে সম্পাদনের মাধ্যমে সম্পদের সর্বোচ্চ ব্যবহার করা যায়।

চ্যালেঞ্জ

  1. সিঙ্ক্রোনাইজেশন: সঠিকভাবে সিঙ্ক্রোনাইজেশন না করলে ডেটা অসঙ্গতি এবং প্রতিযোগিতামূলক অবস্থার সৃষ্টি হতে পারে।
  2. ডিবাগিং: সমান্তরাল প্রোগ্রামিং ডিবাগ করা তুলনামূলকভাবে কঠিন হতে পারে কারণ বিভিন্ন থ্রেডের কার্যক্রম একসাথে চলে।
  3. কমপ্লেক্সিটি: সমান্তরাল প্রোগ্রামিংয়ের লজিক অনেক সময় জটিল হয়ে যায়, বিশেষ করে বৃহৎ সিস্টেমে।

উপসংহার

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

Content added By

সমান্তরাল প্রোগ্রামিং এর ধারণা

127

সমান্তরাল প্রোগ্রামিং এর ধারণা

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

মূল ধারণা

প্রসেস এবং থ্রেড:

  • প্রসেস: একটি স্বতন্ত্র প্রোগ্রাম যা নিজস্ব মেমরি স্পেস ধারণ করে।
  • থ্রেড: একটি প্রসেসের ভিতরে চলমান কার্যকলাপের একক ইউনিট। একটি প্রসেসে একাধিক থ্রেড থাকতে পারে।

সমান্তরালতা বনাম প্যারালালিজম:

  • সমান্তরালতা: কাজগুলো সমান্তরালভাবে চলতে পারে, কিন্তু তারা বাস্তবে একই সময়ে চলতে নাও পারে (যেমন, একাধিক কাজ একটি একক কোরে সম্পন্ন হতে পারে)।
  • প্যারালালিজম: কাজগুলো একই সময়ে একাধিক কোর বা প্রসেসরে বাস্তবিকভাবে চলমান।

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

  • বিভিন্ন থ্রেডের মধ্যে সঠিক ডেটার নিরাপত্তা বজায় রাখতে সিঙ্ক্রোনাইজেশন ব্যবহার করা হয়। সাধারণ সিঙ্ক্রোনাইজেশন মেকানিজমগুলির মধ্যে লক, সেমাফোর এবং মিউটেক্স অন্তর্ভুক্ত।

ব্যবহারের ক্ষেত্র

ক্লাউড কম্পিউটিং:

  • সমান্তরাল প্রোগ্রামিং ক্লাউড সার্ভিসের জন্য সঠিক হতে পারে, যেখানে বিভিন্ন সার্ভার একসাথে কাজ করে।

ডেটাবেস প্রসেসিং:

  • একাধিক ব্যবহারকারী বা থ্রেড ডেটাবেসে একসাথে তথ্য প্রবেশ বা সম্পাদনা করতে পারে।

গেম ডেভেলপমেন্ট:

  • গেমের বিভিন্ন অংশ যেমন অ্যানিমেশন, ইউজার ইন্টারঅ্যাকশন, এবং ফিজিক্স সমান্তরালভাবে কাজ করে।

ডেটা বিশ্লেষণ:

  • বড় ডেটা সেটের জন্য সমান্তরাল প্রোগ্রামিং ব্যবহার করা হয় যাতে দ্রুত বিশ্লেষণ করা যায়।

সুবিধা

কার্যকারিতা:

  • একাধিক প্রসেসর বা কোর ব্যবহার করে কর্মক্ষমতা বাড়ানো যায়, যা কাজের সম্পন্ন সময় কমায়।

প্রতিক্রিয়া:

  • ইউজার ইন্টারফেস অ্যাপ্লিকেশনগুলিতে প্রতিক্রিয়া উন্নত হয়, কারণ ব্যাকগ্রাউন্ডে কাজ চলতে থাকে।

সম্পদ ব্যবস্থাপনা:

  • বিভিন্ন কাজ একসাথে সম্পাদনের মাধ্যমে সম্পদের সর্বোচ্চ ব্যবহার করা যায়।

চ্যালেঞ্জ

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

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

ডিবাগিং:

  • সমান্তরাল প্রোগ্রামিং ডিবাগ করা তুলনামূলকভাবে কঠিন হতে পারে, কারণ বিভিন্ন থ্রেডের কার্যক্রম একসাথে চলে।

কমপ্লেক্সিটি:

  • সমান্তরাল প্রোগ্রামিংয়ের লজিক অনেক সময় জটিল হয়ে যায়, বিশেষ করে বৃহৎ সিস্টেমে।

উপসংহার

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

Content added By

থ্রেড, প্রসেস, এবং Synchronization

149

থ্রেড, প্রসেস, এবং Synchronization

থ্রেড, প্রসেস, এবং Synchronization সমান্তরাল প্রোগ্রামিংয়ের মূল উপাদান। এগুলি সফটওয়্যার ডেভেলপমেন্টে কার্যক্রমের কার্যকরীতা এবং ডেটার নিরাপত্তা নিশ্চিত করতে সহায়ক।


১. প্রসেস (Process)

বর্ণনা: একটি প্রসেস হল একটি চলমান প্রোগ্রামের একটি উদাহরণ। এটি নিজস্ব মেমরি স্পেস, কোড, ডেটা এবং অন্যান্য সম্পদ ধারণ করে। একাধিক প্রসেস একই সময়ে চলতে পারে এবং প্রতিটি প্রসেস একটি স্বাধীন ইউনিট হিসেবে কাজ করে।

বিশেষত্ব:

  • স্বতন্ত্র: প্রতিটি প্রসেসের নিজস্ব মেমরি স্পেস থাকে, তাই একটি প্রসেস অন্য প্রসেসের মেমরিতে সরাসরি প্রবেশ করতে পারে না।
  • সম্পদ: প্রসেসগুলি সিস্টেমের সম্পদ যেমন CPU, মেমরি, এবং I/O ডিভাইসগুলি ব্যবহার করে।
  • সিস্টেম কল: প্রসেসগুলি সিস্টেম কলের মাধ্যমে কোরের সাথে যোগাযোগ করে।

উদাহরণ:

  • একটি ওয়েব ব্রাউজার, একটি টেক্সট এডিটর, অথবা একটি গেম হল আলাদা আলাদা প্রসেস।

২. থ্রেড (Thread)

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

বিশেষত্ব:

  • শেয়ারড রিসোর্স: থ্রেডগুলি একই প্রসেসের মেমরি এবং সম্পদ শেয়ার করে, যা দ্রুত যোগাযোগের সুযোগ দেয়।
  • হালকা: থ্রেড তৈরি করা এবং পরিচালনা করা তুলনামূলকভাবে সহজ এবং দ্রুত।
  • অ্যাসিঙ্ক্রোনাস কার্যক্রম: থ্রেডগুলি প্যারালাল কার্যকলাপ চালাতে সক্ষম, যেমন ব্যাকগ্রাউন্ডে কাজ করা।

উদাহরণ:

  • একটি ওয়েব ব্রাউজারের থ্রেড একটি ইউজার ইন্টারফেস পরিচালনা করতে পারে, অন্য একটি থ্রেড ডেটা ডাউনলোড করতে পারে।

৩. Synchronization

বর্ণনা: Synchronization হল একটি প্রক্রিয়া যা একাধিক থ্রেড বা প্রসেসের মধ্যে সঠিকভাবে কাজের সমন্বয় ঘটায়। এটি নিশ্চিত করে যে একাধিক থ্রেড বা প্রসেস একই সময়ে একটি শেয়ারড রিসোর্সে প্রবেশ না করে।

বিশেষত্ব:

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

উদাহরণ:

import threading

# একটি শেয়ারড ভ্যারিয়েবল
counter = 0
lock = threading.Lock()  # লক তৈরি

def increment():
    global counter
    for _ in range(100000):
        with lock:  # লক অর্জন
            counter += 1  # শেয়ারড রিসোর্সে কাজ

# থ্রেড তৈরি
thread1 = threading.Thread(target=increment)
thread2 = threading.Thread(target=increment)

# থ্রেড শুরু
thread1.start()
thread2.start()

# থ্রেড শেষ হওয়া পর্যন্ত অপেক্ষা করা
thread1.join()
thread2.join()

print(counter)  # সঠিক ফলাফল: 200000

উপসংহার

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

Content added By

Deadlock এবং Race Condition এর প্রতিরোধ

159

Deadlock এবং Race Condition এর প্রতিরোধ

Deadlock এবং Race Condition হল সমান্তরাল প্রোগ্রামিংয়ে সাধারণ সমস্যা, যা সঠিকতা এবং কার্যকারিতাকে প্রভাবিত করতে পারে। নিচে এই দুটি সমস্যা এবং তাদের প্রতিরোধের পদ্ধতি আলোচনা করা হলো।


১. Deadlock

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

উদাহরণ:

  • থ্রেড A সম্পদ 1 লক করে এবং সম্পদ 2 এর জন্য অপেক্ষা করছে, যখন থ্রেড B সম্পদ 2 লক করে এবং সম্পদ 1 এর জন্য অপেক্ষা করছে।

Deadlock প্রতিরোধের পদ্ধতি:

লক অর্ডারিং:

  • সম্পদগুলির জন্য একটি নির্দিষ্ট অর্ডার সেট করা, যাতে থ্রেডগুলি সম্পদগুলি সেই নির্দিষ্ট ক্রমে দাবী করে। এতে করে লকিং অর্ডার ভঙ্গ করা যাবে না।

টাইমআউট:

  • যদি থ্রেড একটি সম্পদ পেতে টাইমআউট করে, তাহলে এটি লক মুক্ত করতে পারে এবং পুনরায় চেষ্টা করতে পারে।

মিউটেক্স এবং সেমাফোরের সঠিক ব্যবহার:

  • সঠিকভাবে মিউটেক্স এবং সেমাফোর ব্যবহার করে এবং সেগুলি সঠিকভাবে পরিচালনা করে deadlock এড়ানো যায়।

গ্রাফের ভিত্তিতে পর্যবেক্ষণ:

  • সম্পদের জন্য গ্রাফ তৈরি করে এবং চক্র থাকলে deadlock শনাক্ত করা এবং সমাধান করা যায়।

২. Race Condition

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

উদাহরণ:

  • দুটি থ্রেড একই ভেরিয়েবলকে আপডেট করছে, এবং তাদের মধ্যে কোনটি প্রথমে কাজ সম্পন্ন করবে তা নিশ্চিত নয়।

Race Condition প্রতিরোধের পদ্ধতি:

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

  • শেয়ারড সম্পদ বা ভেরিয়েবলের অ্যাক্সেস সিঙ্ক্রোনাইজ করার জন্য মিউটেক্স, সেমাফোর বা লক ব্যবহার করা। এটি নিশ্চিত করে যে শুধুমাত্র একটি থ্রেড একই সময়ে সম্পদ অ্যাক্সেস করতে পারে।

অ্যাটমিক অপারেশন:

  • কিছু অপারেশনকে অ্যাটমিক হিসেবে নির্ধারণ করা, অর্থাৎ তারা সম্পূর্ণ হবে একযোগে এবং অন্য থ্রেডের দ্বারা বিঘ্নিত হবে না।

থ্রেড সেফ কোড:

  • কোড লিখার সময় থ্রেড সেফ ফাংশন বা ডেটা স্ট্রাকচার ব্যবহার করা যাতে race condition রোধ করা যায়।

ক্লাস বা অবজেক্ট ডিজাইন:

  • যদি সম্ভব হয়, তবুও ক্লাস বা অবজেক্ট ডিজাইনে ডেটার মধ্যে শেয়ারিং কমিয়ে আনুন, যাতে প্রত্যেক থ্রেড আলাদা আলাদা কপি ব্যবহার করতে পারে।

উপসংহার

Deadlock এবং Race Condition হল সমান্তরাল প্রোগ্রামিংয়ের গুরুতর সমস্যা, কিন্তু সঠিক পরিকল্পনা এবং প্রযুক্তি ব্যবহার করে এগুলি প্রতিরোধ করা সম্ভব। লকিং মেকানিজম, সিঙ্ক্রোনাইজেশন, এবং সঠিক ডিজাইন প্যাটার্ন ব্যবহার করে এই সমস্যা সমাধান করা যায়। সুতরাং, ডেভেলপারদের উচিত এই সমস্যাগুলি সম্পর্কে সচেতন থাকা এবং যথাযথ প্রতিরোধমূলক ব্যবস্থা গ্রহণ করা।

Content added By

উদাহরণ: Java এর concurrency tools

168

Java এর Concurrency Tools

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


১. Thread Class

বর্ণনা: Java এর Thread ক্লাস ব্যবহার করে একটি নতুন থ্রেড তৈরি করা যায়। এটি Runnable ইন্টারফেসের সাহায্যে কার্যকরী কোড পরিচালনা করে।

উদাহরণ:

class MyThread extends Thread {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("Thread: " + i);
            try {
                Thread.sleep(500); // 500 মিলিসেকেন্ডের জন্য ঘুমিয়ে থাকা
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class ThreadExample {
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start(); // থ্রেড শুরু
    }
}

২. Runnable Interface

বর্ণনা: Runnable ইন্টারফেস একটি উপায় যা থ্রেড তৈরি করার জন্য ব্যবহার করা হয়। এটি run() মেথডের মাধ্যমে কার্যকরী কোড সরবরাহ করে।

উদাহরণ:

class MyRunnable implements Runnable {
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("Runnable: " + i);
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public class RunnableExample {
    public static void main(String[] args) {
        Thread thread = new Thread(new MyRunnable());
        thread.start();
    }
}

৩. Executor Framework

বর্ণনা: Java এর Executor ফ্রেমওয়ার্ক থ্রেড পরিচালনা এবং কাজের জন্য একটি উচ্চ স্তরের API প্রদান করে। এটি থ্রেড তৈরি এবং পরিচালনার প্রক্রিয়া সহজ করে।

উদাহরণ:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Task implements Runnable {
    public void run() {
        System.out.println("Task executed by: " + Thread.currentThread().getName());
    }
}

public class ExecutorExample {
    public static void main(String[] args) {
        ExecutorService executor = Executors.newFixedThreadPool(3); // থ্রেড পুল তৈরি
        for (int i = 0; i < 5; i++) {
            executor.execute(new Task()); // কাজ সম্পাদন করা
        }
        executor.shutdown(); // থ্রেড পুল বন্ধ করা
    }
}

৪. Synchronized Blocks

বর্ণনা: Synchronized ব্লক ব্যবহার করে, আপনি শেয়ারড রিসোর্সে অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। এটি থ্রেড নিরাপত্তা নিশ্চিত করে।

উদাহরণ:

class Counter {
    private int count = 0;

    public synchronized void increment() { // সিঙ্ক্রোনাইজড মেথড
        count++;
    }

    public int getCount() {
        return count;
    }
}

public class SyncExample {
    public static void main(String[] args) throws InterruptedException {
        Counter counter = new Counter();

        Thread thread1 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        Thread thread2 = new Thread(() -> {
            for (int i = 0; i < 1000; i++) {
                counter.increment();
            }
        });

        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();

        System.out.println("Final Count: " + counter.getCount()); // সঠিক ফলাফল
    }
}

৫. CountDownLatch

বর্ণনা: CountDownLatch একটি সমান্তরাল পদ্ধতি যা একটি থ্রেডকে অপেক্ষা করতে দেয় যতক্ষণ না অন্য এক বা একাধিক থ্রেড কাজ সম্পন্ন করে।

উদাহরণ:

import java.util.concurrent.CountDownLatch;

class Worker implements Runnable {
    private CountDownLatch latch;

    public Worker(CountDownLatch latch) {
        this.latch = latch;
    }

    public void run() {
        System.out.println(Thread.currentThread().getName() + " is working...");
        try {
            Thread.sleep(2000); // কাজের সময়
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            latch.countDown(); // কাজ সম্পন্ন হলে ল্যাচ কমান
        }
    }
}

public class CountDownLatchExample {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3); // 3 থ্রেডের জন্য ল্যাচ

        for (int i = 0; i < 3; i++) {
            new Thread(new Worker(latch)).start();
        }

        latch.await(); // সমস্ত কাজ সম্পন্ন হওয়া পর্যন্ত অপেক্ষা
        System.out.println("All workers have finished!");
    }
}

উপসংহার

Java এর concurrency tools থ্রেড ম্যানেজমেন্ট, সিঙ্ক্রোনাইজেশন, এবং অন্যান্য সমান্তরাল কার্যকলাপ সহজ করতে সহায়ক। এগুলি সমান্তরাল প্রোগ্রামিংয়ের জন্য শক্তিশালী এবং কার্যকরী পদ্ধতি সরবরাহ করে, যা সফটওয়্যার ডেভেলপমেন্টকে আরও কার্যকর এবং গতিশীল করে তোলে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...