StringBuffer এবং StringBuilder এর মধ্যে কমন হচ্ছে, দুইটার অবজেক্ট ই Mutable.

StringBuilder, StringBuffer এর থেকে বেশী ইফিশিয়ান্ট।

StringBuffer হচ্ছে Synchronized, Thread safe যেখানে StringBuilder এর ক্ষেত্রে Non synchronized, Thread safe না।

তো এইখানে Synchronized, Thread safe এগুলা কি? আর এছাড়াও এদের মধ্যে আর কি কি পার্থক্য আছে?

ধন্যবাদ :)

asked 23 Oct '16, 17:26

_Shaon_'s gravatar image

_Shaon_
796218

retagged 29 Oct '16, 08:37

menon's gravatar image

menon
4.7k334


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

একই ভাবে আপনি যদি জাভার জন্য Eclipse IDE ব্যবহার করেন তবে সেখানে কোড লিখতে গিয়ে যদি ভুল Syntex লিখেন তবে সেটা সঠিক না করা পর্যন্ত পাশে এরর দেখায় । আবার অটোমেটিক বিভিন্ন ক্লাসের ফাংশনের, ভারিয়েবলের সাজেশন দেয় ।

এখানে প্রত্যেকটা কাজই কিন্তু আলাদা । কোনটার সাথে কোনটার মিল নেই । এই যে অনেক গুলো কাজ একসাথে হচ্ছে ।এই বিষয় কেই প্রোগ্রামিং এর ভাষায় Multithreadin বলা হয় । জাভা তে Multithreading সুবিধা দেয়ার জন্য Thread ক্লাস আছে । যেটার মাধ্যমে আপনি আপনার প্রোগ্রামে Multithreading সুবিধা অ্যাড করতে পারবেন ।

এখন প্রশ্ন হল Thread Safe কি ?

উপরে আমারা যে ভিন্ন ভিন্ন কাজের কথা বললাম সেই প্রত্যেক টা কাজ কে একএকটা Thread বলা হয় । Multithreading এর যেমন সুবিধা আছে তেমনি এটাকে আপনি যদি ভালভাবে নিয়ন্ত্রণ করতে না পারেন তবে অনেক অসুবিধায় পড়বেন । যেমন :

ধরুন কোন একটা ব্যাংক সিস্টেমে CustomerAccount নামে একটা ক্লাস আছে এবং এর মাঝে void diposit(int amount) নামে public ফাংশন আছে । ওই ব্যাংকের সব ইউজার এই একটা ফাংশনের মাধ্যমেই তাদের টাকা জামা করে রাখে । আপনি যেহেতু আপনার সিস্টেমে Multithreading এর সুবিধা রাখছেন সেহেতু ব্যাংকের অনেক ইউজার এই public diposit ফাংশন একই সাথে ব্যবহার করতে পারবে ।

        public void deposit (int amount) {
                 balance = balance + amount;
        }

এখন দেখা গেল যে কোন একটা ইউজার এই diposit() ফাংশনকে ব্যবহার করছে এবং তার এই ফাংশন ব্যবহার করা শেষ হওয়ার আগেই অন্য একজন ইউজার এই ফাংশনের ভেতর ঢুকে গেল । এই পরিস্থিতিতে ডাটা নষ্ট হওয়ার সম্ভবনা অনেক বেড়ে যায় । এই জন্য এই CustomerAccount ক্লাস টা Thread Safe না ।

এখন প্রশ্ন হল Synchronization কি ?

উপরে আমরা যে সমস্যার কথা বললাম মূলত সেই ধরনের সমস্যা সমাধান করার জন্যই Thread Synchronization এর ব্যবস্থা আছে ।যেমন আপনি যদি উপরের ফাংশনকে নিচের মত করে লিখেন ,

        public synchronized void deposit (int amount) {
                 balance = balance + amount;
        }

এখন উপরের সমস্যাটা হবে না । কারণ ফাংশনের আগে synchronized ব্যবহার করাই, যখন কোন একজন ইউজার এই ফাংশনের ভেতর থাকবে তখন এই ফাংশন Lock হয়ে যাবে । যার যার ফলে এই সময় অন্য কোন ইউজার (Thread ) এই ফাংশনে ঢুকতে পারবে না । ফাংশনে কাজ সুম্পুরন শেষ হলে এটা Unlock হয়ে যাবে । তখন আবার যে কোন ইউজার ( Thread ) এই ফাংশন ব্যবহার করতে পারবে । তাই এখানে ডাটা হারানোর কোন সুযোগ নাই এই জন্যই এই CustomerAccount ক্লাস কে আমরা Thread Safe বলতে পারি ।

আরও অনেক ভাবেই synchronized ফাংশন অর্জন করা যায় । যেগুলো জানার জন্য আপনি যে কোন জাভার বই দেখতে পারেন ।

ধন্যবাদ :)

permanent link

answered 28 Oct '16, 05:33

menon's gravatar image

menon
4.7k334

edited 29 Oct '16, 08:34

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • link:[text](http://url.com/ "title")
  • image?![alt text](/path/img.jpg "title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Question tags:

×56
×2
×2
×1
×1

question asked: 23 Oct '16, 17:26

question was seen: 571 times

last updated: 29 Oct '16, 08:37