জাভা সিঙ্ক্রোনাইজড কীওয়ার্ডের সি # সংস্করণ?


313

সি # এর জাভা "সিঙ্ক্রোনাইজড" কীওয়ার্ডটির নিজস্ব সংস্করণ রয়েছে?

অর্থাৎ জাভাতে এটি কোনও ফাংশন, কোনও অবজেক্ট বা কোডের ব্লকের সাথে নির্দিষ্ট করা যেতে পারে:

public synchronized void doImportantStuff() {
   // dangerous code goes here.
}

অথবা

public void doImportantStuff() {
   // trivial stuff

   synchronized(someLock) {
      // dangerous code goes here.
   }
}

3
ব্লক ফর্মটি লক করার জন্য একটি রেফারেন্স প্রয়োজন। পদ্ধতিতে ফর্মটিতে লক অবজেক্টটি স্পষ্টতই এটি (বা শ্রেণি [this.class, স্থির পদ্ধতির জন্য getClass () নয়, তবে ক্লাসগুলিতে লক করবেন না)।
টম হাটিন -

1
এখনও সুরক্ষিত নেই? আমি সবসময় এখানে আসি কারণ আমি এই [MethodImpl(MethodImplOptions.Synchronized)]লাইনটি মনে করতে পারি না ।
বিটারব্লু

1
আমি মনে করি আপনার দ্বিতীয় স্নিপেটটি সংকলন করবে না - এটি কোনও কিছুর সাথে সিঙ্ক্রোনাইজ করা দরকার ।
পাওয়ারেডবাইরাইস

উত্তর:


466

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

পদ্ধতি-স্তরের স্টাফগুলির জন্য, এখানে রয়েছে [MethodImpl]:

[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}

এটি অ্যাক্সেসরগুলিতে (বৈশিষ্ট্য এবং ইভেন্ট) ব্যবহার করা যেতে পারে:

private int i;
public int SomeProperty
{
    [MethodImpl(MethodImplOptions.Synchronized)]
    get { return i; }
    [MethodImpl(MethodImplOptions.Synchronized)]
    set { i = value; }
}

লক্ষ্য করুন ঘটনা মত ক্ষেত্র হয় , ডিফল্ট অনুসারে সিঙ্ক্রোনাইজ যখন স্বয়ং-বাস্তবায়িত বৈশিষ্ট্য নয় :

public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized

ব্যক্তিগতভাবে, আমি বাস্তবায়ন পছন্দ না MethodImplএটা লক যেমন thisবা typeof(Foo)যা সেরা প্রথার বিপরীতে নিজে -। পছন্দসই বিকল্পটি হল আপনার নিজের লকগুলি ব্যবহার করা:

private readonly object syncLock = new object();
public void SomeMethod() {
    lock(syncLock) { /* code */ }
}

নোট করুন যে ক্ষেত্রের মতো ইভেন্টগুলির জন্য, লকিং বাস্তবায়ন সংকলকের উপর নির্ভরশীল; পুরানো মাইক্রোসফ্ট সংকলকগুলিতে এটি একটি lock(this)/ lock(Type)- তবে সাম্প্রতিক সংকলকগুলিতে এটিInterlocked আপডেটগুলি ব্যবহার করে - সুতরাং দুষ্টু অংশগুলি ছাড়াই থ্রেড-নিরাপদ।

এটি আরও দানাদার ব্যবহারের অনুমতি দেয় এবং থ্রেডগুলির মধ্যে যোগাযোগের জন্য Monitor.Wait/ Monitor.Pulseইত্যাদি ব্যবহারের অনুমতি দেয় ।

সম্পর্কিত ব্লগ এন্ট্রি (পরে পুনর্বিবেচিত )।


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

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

6
মার্ক এর লিঙ্ক ব্লগ পোস্ট রয়েছে মার্চ 2010 ফলো-আপ এই বলে যে .NET 4.0, এ MethodImplএবং ঘটনা ক্ষেত্র মত এখন ভাল সিঙ্ক্রোনাইজেশন কোড জেনারেট, এবং এটি আর আপনার নিজের কেশ ব্যবহার করা প্রয়োজন।
ররি ও'কেনে

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

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

57
static object Lock = new object();

lock (Lock) 
{
// do stuff
}

9
আপনি কি নিশ্চিত আপনার লক অবজেক্টটিকে স্থির হিসাবে ঘোষণা করতে চান ..?
সার্জ

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

32
যদি আমরা প্রশ্নকারীর প্রশ্নের প্রসঙ্গে থাকি তবে আমরা উদাহরণ পদ্ধতিগুলি সম্পর্কে কথা বলছি। স্ট্যাটিক ব্যবহারের অর্থ হ'ল যদি থ্রেড 1 কল করে উদাহরণ 1 o থ্রেড 2 এর কলটি অবরুদ্ধ করা উচিত না যদি না কেউ একই বস্তুতে ডসোমিংথিং কল করে । আপনার ভুল বলছেন না, তবে এখানে স্থির ব্যবহারের প্রভাবটি বোঝা গুরুত্বপূর্ণ, কারণ এটি প্রতি উদাহরণের পরিবর্তে বিশ্বব্যাপী অবরুদ্ধ করে খারাপ পারফরম্যান্সের কারণ হতে পারে।
অ্যারোনএলএস

1
@ অ্যারোনলএস স্ট্যাটিক লকটি যদি খুব কার্যকর হয় যখন আপনার অবজেক্টটি তার চেয়েও বড় সুযোগে ক্রিয়া সম্পাদন করে। উদাহরণস্বরূপ ওয়েব-পরিষেবাগুলির সাথে সর্বদা ঘটে।
থিবল্ট ডি

3
-1 এ হিসাবে ওপি যা বলছে তার চেয়ে আলাদা আচরণ behavior এটি একটি শ্রেণি লক, উদাহরণ লক নয়।
টিস্টার

39

সি # এর জাভা "সিঙ্ক্রোনাইজড" কীওয়ার্ডটির নিজস্ব সংস্করণ রয়েছে?

নং সি-তে, আপনি স্পষ্টতই lockসংস্থান করেছেন যে আপনি অবিচ্ছিন্ন থ্রেড জুড়ে সুসংগতভাবে কাজ করতে চান। lockএকটি ব্লক খোলে; এটি পদ্ধতি স্তরে কাজ করে না।

যাইহোক, অন্তর্নিহিত প্রক্রিয়াটি রানটাইমে (এবং পরবর্তীকালে ) অনুরোধ করে lockকাজ করার কারণে একই । সান ডকুমেন্টেশন অনুসারে জাভা একইভাবে কাজ করে ।Monitor.EnterMonitor.Exit


3
এর সমতুল্য "কীওয়ার্ড" নেই, তবে উপরের মার্ক গ্র্যাভেলের উত্তর হিসাবে আপনি [মেথডিম্পল (মেথডিম্পলপশনস.সাইনক্রোনাইজড)] টিকাটি ব্যবহার করে পদ্ধতি স্তরে সিঙ্ক্রোনাইজ করতে পারেন।
মাইন্ডজুইস

1
জাভা synchronizedপদ্ধতিতে যেহেতু মূলত synchronized (this.getClass())সি # তে একই রকম হয় না lock(typeof(this))?
শ্রী হর্ষ চিলকাপতি

2
@ শ্রীহর্ষচিলাপতি যা কেবল আংশিকভাবে সঠিক, synchronizedকোনও পদ্ধতিতে জাভার কীওয়ার্ডটি আরও পছন্দ: synchronized(this)কেবল স্থির পদ্ধতিতে এটির মতো আচরণ করে synchronized(class)
bvdb

7

লক্ষ করুন, পুরো পথ সহ লাইন: [MethodImpl(MethodImplOptions.Synchronized)]দেখতে দেখতে হবে

[System.Runtime.CompilerServices.MethodImpl(System.Runtime.CompilerServices.MethodImplOptions.Synchronized)]


1
বা আপনি কেবল ব্যবহার করতে পারেনusing System.Runtime.CompilerServices;
এলোআইএসডিজি

আমি মন্তব্যটি লিখেছিলাম যখন আমি কিছুদিন বা সপ্তাহের বেশি না হয়ে সি # প্রোগ্রাম করার পরে স্টেটমেন্টগুলি ব্যবহার করে স্বয়ংক্রিয়ভাবে সন্নিবেশ সম্পর্কে জানতাম না এবং আমি এই 3 টি উর্ধ্বতন সম্পর্কে অবাক হয়েছি।
ট্রাবেনফুচস

1
আপনি কমপক্ষে 3 টি
দেবকে

5

আপনি lockপরিবর্তে বিবৃতি ব্যবহার করতে পারেন । আমি মনে করি এটি কেবল দ্বিতীয় সংস্করণটি প্রতিস্থাপন করতে পারে। এছাড়াও, মনে রাখবেন যে উভয় synchronizedএবং lockএকটি বস্তুর উপর অপারেট করা প্রয়োজন।

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