আপনি জাভাতে সর্বাধিক ঘন সম্মতিযুক্ত সমস্যাটি কী? [বন্ধ]


191

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


16
কেন এটি বন্ধ? জাভাতে ভিক্ষাবৃত্তি করা অন্যান্য প্রোগ্রামারদের জন্য এবং জাভা অন্যান্য বিকাশকারীদের দ্বারা সর্বাধিক ত্রুটিগুলির কী শ্রেণিটি সবচেয়ে বেশি পর্যবেক্ষণ করা হচ্ছে তা সম্পর্কে ধারণা পাওয়ার জন্য এটি উভয়ই কার্যকর।
L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o̲̳̳k̲̳̳e̲̳̳

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

7
আমি অনুমান করি যে এই নিবন্ধটি 100+ ভিউ / দিন পেয়েছে বলে সম্প্রদায় একমত নয়! আমি এটি বেশ কার্যকর বলে মনে করেছি যে আমি স্থির বিশ্লেষণ সরঞ্জামটির বিকাশের সাথে জড়িত রয়েছি বিশেষত কনক্লান্টি সম্পর্কিত সমস্যাগুলি সংশোধন করার জন্য ডিজাইন করা / থ্রেডসেসফে । থ্রেডস্যাফটি পরীক্ষা ও উন্নত করার জন্য সাধারণত মোকাবিলা করা একত্রী সমস্যাগুলির একটি ব্যাংক থাকা দুর্দান্ত।
ক্রেগ ম্যানসন

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

উত্তর:


125

আমি দেখেছি যে সর্বাধিক সাধারণ একত্রীকরণ সমস্যাটি বোঝা যাচ্ছে না যে একটি থ্রেড দ্বারা রচিত ক্ষেত্রটি অন্য থ্রেডের দ্বারা দেখার নিশ্চয়তা নেই । এটির একটি সাধারণ প্রয়োগ:

class MyThread extends Thread {
  private boolean stop = false;

  public void run() {
    while(!stop) {
      doSomeWork();
    }
  }

  public void setStop() {
    this.stop = true;
  }
}

যতদিন স্টপ হিসাবে নয় উদ্বায়ী বা setStopএবং runনেই সিঙ্ক্রোনাইজ এই কাজ নিশ্চিত নয়। এই ভুলটি বিশেষত পৈশাচিক হিসাবে 99.999% এর হিসাবে এটি বাস্তবে কোনও ব্যাপার হবে না কারণ শেষ পর্যন্ত পাঠক থ্রেডটি পরিবর্তনটি দেখতে পাবে - তবে আমরা জানি না যে তিনি এটি কত তাড়াতাড়ি দেখেছিলেন।


9
এর দুর্দান্ত সমাধান হ'ল স্টপ ইন্সটেন্সটি ভেরিয়েবলকে একটি অ্যাটমিকবুলিয়ান করা। এটি আপনাকে জেএমএম ইস্যু থেকে রক্ষা করার সময় অ-অস্থির সমস্ত সমস্যার সমাধান করে।
উইলির

39
এটি 'বেশ কয়েক মিনিটের জন্য' এর চেয়ে খারাপ - আপনি এটি কখনও দেখেন না। মেমোরি মডেলের অধীনে, জেভিএমকে যখন (সত্য) এর মধ্যে (! থামিয়ে দেওয়া) এবং তারপরে আপনি টেনে তোলেন তখন অপ্টিমাইজ করার অনুমতি দেওয়া হয়। এটি কেবলমাত্র কিছু সার্ভিস মোডে, কিছু ভিএম-তে ঘটতে পারে কেবল তখন যখন JVM লুপের এক্স পুনরাবৃত্তির পরে পুনরায় কম্পাইল করে O
কাউয়ান

2
কেন আপনি অ্যাটমিকবুলিয়ানটি উদ্বায়ী বুলেটিয়ান ব্যবহার করতে চান? আমি সংস্করণ 1.4+ এর জন্য বিকাশ করছি, সুতরাং কেবলমাত্র অস্থির ঘোষণা দিয়ে কোনও সমস্যা আছে?
পুল ২

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

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

178

আমার # 1 সবচেয়ে বেদনাদায়ক একত্রীকরণ সমস্যাটি তখনই ঘটেছিল যখন দুটি ভিন্ন ওপেন সোর্স লাইব্রেরি এরকম কিছু করেছিল:

private static final String LOCK = "LOCK";  // use matching strings 
                                            // in two different libraries

public doSomestuff() {
   synchronized(LOCK) {
       this.work();
   }
}

প্রথম নজরে, এটি দেখতে বেশ তুচ্ছ সিঙ্ক্রোনাইজেশন উদাহরণের মতো দেখাচ্ছে। যাহোক; স্ট্রিংস জাভাতে অভ্যন্তরীণ থাকার কারণে , আক্ষরিক স্ট্রিং "LOCK"একই উদাহরণে পরিণত হয় java.lang.String(যদিও তারা একে অপরের থেকে সম্পূর্ণ পৃথকভাবে ঘোষণা করা হয়)) ফলাফলটি অবশ্যই খারাপ।


62
আমি ব্যক্তিগত স্ট্যাটিক চূড়ান্ত অবজেক্ট LOCK = নতুন অবজেক্ট () পছন্দ করার কারণগুলির মধ্যে এটি একটি;
আন্দ্রেজেজ ডয়েল

17
আমি এটা ভালবাসা - উহু, এই কদর্য :) হল
Thorbjørn Ravn অ্যান্ডারসনকে

7
যে জাভা Puzzlers 2. একটি ভাল এক
Dov ওয়েসারম্যান

12
প্রকৃতপক্ষে ... এটি সত্যিই আমাকে সংকলকটি আপনাকে একটি স্ট্রিংয়ের সাথে সিঙ্ক্রোনাইজ করার অনুমতি দিতে অস্বীকার করতে চায়। স্ট্রিং ইন্টার্নিং দেওয়া, এমন কোনও ঘটনা নেই যেখানে এটি "ভাল জিনিস (টিএম)" হবে।
জেরেদ

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

65

একটি ক্লাসিক সমস্যা হ'ল সিঙ্ক্রোনাইজ করার সময় আপনি যে বিষয়টিকে সিঙ্ক্রোনাইজ করছেন সেটি পরিবর্তন করছে:

synchronized(foo) {
  foo = ...
}

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


19
এটির জন্য একটি আইডিইএ পরিদর্শন রয়েছে যার নাম "চূড়ান্ত নয় এমন ফিল্ডের সিঙ্ক্রোনাইজেশন যাতে দরকারী শব্দার্থবিজ্ঞানের সম্ভাবনা নেই"। খুব সুন্দর.
জেন এস 16

8
হা ... এখন এটি নির্যাতনের বর্ণনা। "দরকারী শব্দার্থবিজ্ঞানের সম্ভাবনা" আরও ভালভাবে "সম্ভবত সম্ভবত ভাঙ্গা" হিসাবে বর্ণনা করা যেতে পারে। :)
অ্যালেক্স মিলার

আমি মনে করি এটি রিটারওয়াইটলকটিতে বিটার জাভা ছিল। ভাগ্যক্রমে আমাদের কাছে এখন java.util.concurrency.locks আছে এবং ডগ বলের দিকে আরও কিছুটা বেশি।
টম হাটিন -

আমি এই সমস্যাটি প্রায়শই দেখেছি। কেবলমাত্র সেই বিষয়ে চূড়ান্ত বস্তুগুলিতে সিঙ্ক করুন। ফাইন্ডব্যাগস এবং অন্যান্য। হ্যাঁ, সাহায্য করুন।
জিম্প

নিয়োগের সময় এটি কি কেবল সমস্যা? (নীচে একটি মানচিত্রের সাথে @ অ্যালেক্স মিলারের উদাহরণ দেখুন) সেই মানচিত্রের উদাহরণটিতেও কি একই সমস্যা থাকবে?
অ্যালেক্স বিয়ার্ডসলে

50

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


আপনি কি এর কোনও সংস্করণে এই বাগটি যুক্ত কোনও ওপেন সোর্স প্রকল্প সম্পর্কে জানেন? আমি রিয়েল ওয়ার্ল্ড সফটওয়্যারগুলিতে এই বাগের দৃ concrete় উদাহরণগুলি খুঁজছি।
পুনরায় প্রোগ্রামার

47

ডাবল-চেকড লকিং। মোটের উপর.

আমি বিআইএতে কাজ করার সময় যে সমস্যাগুলি শিখতে শুরু করেছি, সেই দৃষ্টান্তটি হ'ল লোকেরা নিম্নলিখিত পদ্ধতিতে একটি সিঙ্গলটন পরীক্ষা করবে:

public Class MySingleton {
  private static MySingleton s_instance;
  public static MySingleton getInstance() {
    if(s_instance == null) {
      synchronized(MySingleton.class) { s_instance = new MySingleton(); }
    }
    return s_instance;
  }
}

এটি কখনই কাজ করে না, কারণ অন্য থ্রেডটি সম্ভবত সিঙ্ক্রোনাইজড ব্লকে প্রবেশ করেছে এবং s_instance আর নাল নয়। তাই প্রাকৃতিক পরিবর্তনই এটি করা:

  public static MySingleton getInstance() {
    if(s_instance == null) {
      synchronized(MySingleton.class) {
        if(s_instance == null) s_instance = new MySingleton();
      }
    }
    return s_instance;
  }

এটি কোনওভাবেই কাজ করে না, কারণ জাভা মেমরি মডেল এটি সমর্থন করে না। এটিকে কাজ করতে আপনাকে s_instance কে অস্থির হিসাবে ঘোষণা করতে হবে এবং তারপরেও এটি কেবল জাভা 5 এ কাজ করে।

জনগণ জাভা মেমরি মডেল আপ জগাখিচুড়ি এই এর intricacies সাথে পরিচিত না হন সর্বকালের


7
এনাম সিঙ্গলটন প্যাটার্ন এই সমস্ত সমস্যার সমাধান করে (এটি সম্পর্কে জোশ ব্লচের মন্তব্য দেখুন)। জাভা প্রোগ্রামারদের মধ্যে এর অস্তিত্বের জ্ঞানটি আরও বেশি বিস্তৃত হওয়া উচিত।
রবিন

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

3
আমি সিঙ্গলটন ক্লাসের অলস সূচনাটির জন্য এটি ব্যবহার করি। এছাড়াও কোনও সুসংগতির প্রয়োজন নেই কারণ এটি স্পষ্টভাবে জাভা দ্বারা গ্যারান্টিযুক্ত। ক্লাস ফু {স্ট্যাটিক ক্লাস হোল্ডার {স্ট্যাটিক ফু ফু = নতুন ফু (); } স্ট্যাটিক ফু getInstance () Hold রিটার্ন হোল্ডার.ফু; }}
ইরফান জুলফিকার

ইরফান, যাকে আমি স্মরণ করি যা থেকে পাগের পদ্ধতি বলা হয়
ক্রিস আর

@ রবিন, কেবল স্ট্যাটিক ইনিশিয়ালাইজার ব্যবহার করা কি সহজ নয়? এগুলি সর্বদা সিঙ্ক্রোনাইজড চালানোর গ্যারান্টিযুক্ত।
ম্যাট বি

47

বিশেষত পুনরাবৃত্তি বা একাধিক ক্রিয়াকলাপের সময় ফেরত দেওয়া সামগ্রীতে সঠিকভাবে সিঙ্ক্রোনাইজ করা Collections.synchronizedXXX()হয়নি:

Map<String, String> map = Collections.synchronizedMap(new HashMap<String, String>());

...

if(!map.containsKey("foo"))
    map.put("foo", "bar");

এটা ভুল । একক ক্রিয়াকলাপ সত্ত্বেও synchronized, অনুরোধের মধ্যে মানচিত্রের অবস্থা containsএবং putঅন্য থ্রেড দ্বারা পরিবর্তন করা যেতে পারে। এটা করা উচিত:

synchronized(map) {
    if(!map.containsKey("foo"))
        map.put("foo", "bar");
}

বা একটি ConcurrentMapবাস্তবায়ন সহ:

map.putIfAbsent("foo", "bar");

5
বা আরও ভাল, একটি কনকন্ট্র্যান্ট হ্যাশম্যাপ এবং putIfAbsent ব্যবহার করুন।
টম হাটিন -

37

যদিও আপনি যা চেয়েছিলেন ঠিক তা না হলেও, সবচেয়ে ঘন ঘন সম্মতি সংক্রান্ত সমস্যা যা আমি সম্মুখীন হয়েছি (সম্ভবত এটি সাধারণ একক থ্রেডযুক্ত কোডে আসে তাই) একটি

java.util.ConcurrentModificationException

যেমন জিনিস দ্বারা সৃষ্ট:

List<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c"));
for (String string : list) { list.remove(string); }

না, পুরোপুরি আমি যা খুঁজছি ধন্যবাদ!
অ্যালেক্স মিলার

30

সিঙ্ক্রোনাইজ করা সংগ্রহগুলি সেগুলির তুলনায় আপনাকে আরও সুরক্ষা দেয় তা ভাবা সহজ হতে পারে এবং কলগুলির মধ্যে লকটি রাখা ভুলে যায়। আমি এই ভুলটি কয়েকবার দেখেছি:

 List<String> l = Collections.synchronizedList(new ArrayList<String>());
 String[] s = l.toArray(new String[l.size()]);

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

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


5
ভালো উদাহরণ. আমি মনে করি যে "পারমাণবিক ক্রিয়াকলাপগুলি পরমাণু নয়" হিসাবে আমি আরও সাধারণভাবে এটিকে চক করতাম। (অন্য একটি সাধারণ উদাহরণের জন্য অস্থির ক্ষেত্র ++ দেখুন)
অ্যালেক্স মিলার

29

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


এই উত্তরগুলির মধ্যে একটি আমি কামনা করি আমি একাধিক পয়েন্ট দিতে পারব
এপাগা

2
EDT = ইভেন্ট
প্রেরণের

28

অপেক্ষা করতে ভুলে যাওয়া () বা (কন্ডিশন.ওয়ায়েট ()) একটি লুপে অপেক্ষা করছে যে অপেক্ষা করার অবস্থাটি আসলে সত্য। এটি না করে আপনি উত্সাহী অপেক্ষা () জাগ্রত করা থেকে বাগগুলিতে চলে যান। প্রমিত ব্যবহার হওয়া উচিত:

 synchronized (obj) {
     while (<condition does not hold>) {
         obj.wait();
     }
     // do stuff based on condition being true
 }

26

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


হ্যাঁ, এবং হ্যান্ডলারদের দিয়ে এখন এটি পরিচালনা করার জন্য ভাল সরঞ্জাম রয়েছে।
অ্যালেক্স মিলার

3
আপনি যে কোনও নিবন্ধ বা রেফারেন্সের লিঙ্ক পোস্ট করতে পারেন যা আরও বিস্তারিতভাবে এটি ব্যাখ্যা করে?
অভিজিৎ কাশনিয়া

22

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

public class SomeClass{
    private Integer thing = 1;

    public synchronized void setThing(Integer thing)
        this.thing = thing;
    }

    /**
     * This may return 1 forever and ever no matter what is set
     * because the read is not synched
     */
    public Integer getThing(){
        return thing;  
    }
}

5
পরবর্তী জেভিএম-এর (1.5 এবং এগিয়ে, আমি মনে করি), অস্থির ব্যবহার এটিও ঠিক করে দেবে।
জেমস শেক 23

2
অগত্যা। অস্থিরতা আপনাকে সর্বশেষতম মান দেয় যাতে এটি চিরতরে 1 ফেরত রোধ করে, তবে এটি লকিং সরবরাহ করে না। এটি কাছাকাছি, তবে একরকম নয়।
জন রাসেল

1
@ জোহান রাসেল আমি ভেবেছিলাম যে উদ্বোধন সম্পর্কের আগে হওয়ার নিশ্চয়তা দেয়। "লকিং" না? "একটি উদ্বায়ী ভেরিয়েবলের (§8.3.1.4) ভি সিঙ্ক্রোনাইজ করে - পরবর্তী সমস্ত ভিডের সাথে কোনও থ্রেড (যেখানে পরবর্তীকালে সিঙ্ক্রোনাইজেশন ক্রম অনুসারে সংজ্ঞায়িত করা হয়) সমন্বিত হয়" "
শনি

15

ভেবে আপনি একক-থ্রেডযুক্ত কোড লিখছেন, তবে মিউটেবল স্ট্যাটিক্স (সিঙ্গেলটন সহ) ব্যবহার করছেন। অবশ্যই তারা থ্রেডের মধ্যে ভাগ করা হবে be এটি প্রায়শই অবাক হয়।


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

আমি আশা করব যে এটি সমকালীন প্রোগ্রামিং করা লোকদের কাছে সুস্পষ্ট is থ্রেড-সুরক্ষা পরীক্ষা করার জন্য গ্লোবাল স্টেটের প্রথম স্থান হওয়া উচিত।
gtrak

1
@ গ্যারি থিং, তারা ভাবছেন না যে তারা সমবর্তী প্রোগ্রামিং করছে।
টম হাটিন -

15

যথেচ্ছ পদ্ধতি কলগুলি সিঙ্ক্রোনাইজড ব্লকগুলির মধ্যে থেকে করা উচিত নয়।

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

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

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


13

সর্বাধিক সাম্প্রতিক কনকুরન્સી সম্পর্কিত যে বাগটি আমি চালিয়েছিলাম তা হ'ল একটি অবজেক্ট যা এর নির্মাতায় একটি এক্সিকিউটর সার্ভিস তৈরি করেছিল, কিন্তু যখন অবজেক্টটি আর রেফারেন্স করা হয়নি, এটি কখনও এক্সিকিউটর সার্ভিস বন্ধ করে দেয়নি। এভাবে কয়েক সপ্তাহ ধরে কয়েক হাজার থ্রেড ফাঁস হয়ে যায় এবং শেষ পর্যন্ত সিস্টেমটি ক্র্যাশ হয়ে যায়। (প্রযুক্তিগতভাবে, এটি ক্রাশ হয়নি, তবে এটি চালিয়ে যাওয়ার সময় এটি সঠিকভাবে কাজ করা বন্ধ করে দিয়েছে))

টেকনিক্যালি, আমি মনে করি এটি কোনও সহকারী সমস্যা নয়, তবে এটি java.util.concurrency লাইব্রেরি ব্যবহার সম্পর্কিত একটি সমস্যা।


11

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

একই সমস্যা (আংশিক সিঙ্ক্রোনাইজেশন) আপনি পড়া এবং লেখার সাথে রাষ্ট্র ভাগ করে নেওয়ার যে কোনও জায়গায় ঘটতে পারে।


11

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

public class MyServlet implements Servlet{
    private Object something;

    public void service(ServletRequest request, ServletResponse response)
        throws ServletException, IOException{
        this.something = request.getAttribute("something");
        doSomething();
    }

    private void doSomething(){
        this.something ...
    }
}

10

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

আরও বেশি লোকের গোয়েটসের বইয়ে বর্ণিত সমঝোতা টীকাগুলি (যেমন @ থ্রেডস্যাফ, @ গার্ডেডবি ইত্যাদি) ব্যবহার করা উচিত।


9

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

সম্পাদনা: পৃথক উত্তরের দ্বিতীয় অংশে সরানো হয়েছে।


আপনি কি শেষটিকে আলাদা উত্তর দিয়ে আলাদা করতে পারবেন? আসুন প্রতি পোস্টে এটি 1 রাখুন। এই দুটি সত্যিই ভাল বেশী।
অ্যালেক্স মিলার

9

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


8

ভাগ করা ডেটা স্ট্রাকচারে মিউটেবল ক্লাস

Thread1:
    Person p = new Person("John");
    sharedMap.put("Key", p);
    assert(p.getName().equals("John");  // sometimes passes, sometimes fails

Thread2:
    Person p = sharedMap.get("Key");
    p.setName("Alfonso");

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


8

স্ট্রিং আক্ষরিক দ্বারা সংজ্ঞায়িত স্ট্রিং আক্ষরিক বা ধ্রুবকটির সাথে সংহতকরণ (সম্ভাব্য) স্ট্রিং আক্ষরিক অন্তর্ভুক্ত হওয়ার কারণে সমস্যা এবং একই স্ট্রিং আক্ষরিক ব্যবহার করে জেভিএমের অন্য কেউ ভাগ করে নেবেন। আমি জানি এই সমস্যাটি অ্যাপ্লিকেশন সার্ভার এবং অন্যান্য "ধারক" পরিস্থিতিগুলির মধ্যে এসেছে।

উদাহরণ:

private static final String SOMETHING = "foo";

synchronized(SOMETHING) {
   //
}

এই ক্ষেত্রে, যে কেউ "foo" স্ট্রিংটি লক করতে ব্যবহার করছে একই লকটি ভাগ করছে।


সম্ভবত এটি লক হয়েছে। সমস্যাটি হ'ল WHEN স্ট্রিংয়ের শব্দার্থবিজ্ঞানগুলি অভ্যন্তরীণভাবে আবদ্ধ হয় (বা, আইএমএনএসএইচও, আন্ডার-সংজ্ঞায়িত)। "Foo" এর একটি সংকলক-সময় ধ্রুবকটি ইন্টার্ন করা হয়, যদি আপনি এটি করেন তবে কোনও নেটওয়ার্ক ইন্টারফেস থেকে "ফু" আসছে কেবল ইন্টার্ন করা।
কার্ক ওয়াইলি

ঠিক আছে, সে কারণেই আমি বিশেষত একটি আক্ষরিক স্ট্রিং ধ্রুবক ব্যবহার করেছি, যা অভ্যন্তরীণ হওয়ার গ্যারান্টিযুক্ত।
অ্যালেক্স মিলার

8

আমি বিশ্বাস করি ভবিষ্যতে জাভার মূল সমস্যাটি হবে নির্মাতাদের (অভাবের) দৃশ্যমানতার গ্যারান্টি। উদাহরণস্বরূপ, আপনি যদি নিম্নলিখিত ক্লাসটি তৈরি করেন

class MyClass {
    public int a = 1;
}

এবং তারপর মাত্র MyClass সম্পত্তি পড়া একটি অন্য থ্রেড থেকে, MyClass.a JavaVM বাস্তবায়ন এবং মেজাজ উপর নির্ভর করে হয় 0 বা 1 হতে পারে। আজ 'এ' হওয়ার জন্য সম্ভাবনা খুব বেশি। তবে ভবিষ্যতে NUMA মেশিনগুলিতে এটি আলাদা হতে পারে। অনেক লোক এ সম্পর্কে অবগত নয় এবং বিশ্বাস করে যে তাদের আরম্ভের পর্যায়ে মাল্টি-থ্রেডিংয়ের যত্ন নেওয়ার দরকার নেই।


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

আমি এখনও জেএমএম-এ এমন জিনিসগুলি পেয়েছি যা আমাকে অবাক করে, তাই আমি আমার উপর বিশ্বাস করব না, তবে আমি এটি সম্পর্কে যথেষ্ট নিশ্চিত। Cs.umd.edu/~pugh/java/mmoryModel/… দেখুন । যদি ক্ষেত্রটি চূড়ান্ত হয় তবে এটি কোনও সমস্যা হবে না, তবে এটি সূচনা পর্বের পরে দৃশ্যমান হবে।
টিম জেনসেন

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

3
মাইক্লাস.এ স্ট্যাটিক অ্যাক্সেস নির্দেশ করে এবং 'এ' মাই ক্লাসের স্থির সদস্য নয়। এর বাইরে এটি 'রিনেস' হিসাবে বলেছে, অসম্পূর্ণ বস্তুর কোনও রেফারেন্স ফাঁস হয়ে গেলে, যেমন কনস্ট্রাক্টরের কিছু বাহ্যিক মানচিত্রে 'এটি' যুক্ত করার মতো, এটি কেবল তখনই সমস্যা।
মার্কাস জেভারিং

7

আমি প্রায়শই যে ডাবলস্ট ভুলটি করি তা হ'ল নোটিফিকেশন () বা অপেক্ষা করতে () অপেক্ষা করার আগে কোনও বস্তুতে সিঙ্ক্রোনাইজ করতে ভুলে যাওয়া।


8
সর্বাধিক সাময়িক সমস্যার থেকে ভিন্ন, এটি কি সহজে খুঁজে পাওয়া যায় না? কমপক্ষে আপনি এখানে একটি অবৈধমনিটর স্টেট এক্সেপশন পান ...
প্রোগ্রামার

ধন্যবাদ, এটি সন্ধান করা খুব সহজ ... তবে এটি এখনও একটি বোবা ভুল যা আমার সময়কে তার চেয়ে বেশি সময় নষ্ট করে :)
ডেভ রায়

7

স্থানীয় "নতুন অবজেক্ট ()" কে মিউটেক্স হিসাবে ব্যবহার করা হচ্ছে।

synchronized (new Object())
{
    System.out.println("sdfs");
}

এটি অকেজো।


2
এটি সম্ভবত অকেজো, তবে একেবারে সিঙ্ক্রোনাইজ করার কাজটি কিছু আকর্ষণীয় কাজ করে ... অবশ্যই প্রতিটি সময় একটি নতুন অবজেক্ট তৈরি করা সম্পূর্ণ অপচয়।
তিনি TREE

4
এটি অকেজো নয়। এটি কোনও লক ছাড়াই মেমরির বাধা।
ডেভিড রুসেল

1
@ ডেভিড: একমাত্র সমস্যা
জেভিএম

@ অন্তর্নিহিত আমি দেখছি আপনার মতামত ভাগ করা হয়েছে ibm.com/developerworks/java/library/j-jtp10185/index.html আমি সম্মত হই যে এটি করা একটি নির্বোধ কাজ, কারণ আপনি জানেন না কখন আপনার স্মৃতি বাধাটি সিঙ্ক্রোনাইজ হবে, আমি এটি কেবল দেখানো ছিল যে আরও কিছু করছে।
ডেভিড রুসেল

7

আর একটি সাধারণ 'সম্মতি' ইস্যু হ'ল সিঙ্ক্রোনাইজড কোডটি ব্যবহার করা যখন একেবারেই প্রয়োজন হয় না। উদাহরণস্বরূপ আমি এখনও প্রোগ্রামার ব্যবহার করে StringBufferবা এমনকি java.util.Vector(পদ্ধতি স্থানীয় ভেরিয়েবল হিসাবে) দেখতে পাচ্ছি ।


1
এটি কোনও সমস্যা নয়, তবে অপ্রয়োজনীয়, কারণ এটি জেভিএমকে বিশ্বব্যাপী মেমরির বিপরীতে ডেটা সিঙ্ক করতে বলে এবং তাই এটি মাল্টি-সিপাসে খারাপভাবে চলতে পারে, তাই কেউ সমকালীন ফ্যাশনে সিঙ্ক্রোনাইজেশন ব্লক ব্যবহার করে না।
পুনর্বার 3

6

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


5

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

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


3

লক করার জন্য একটি গ্লোবাল অবজেক্ট যেমন স্ট্যাটিক ভেরিয়েবলের ব্যবহার।

এটি বিতর্কের কারণে খুব খারাপ পারফরম্যান্সের দিকে নিয়ে যায়।


ভাল, কখনও কখনও, কখনও কখনও না। যদি এটি কেবল এত সহজ হত ...
গিম্পফ

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

3

Honesly? আবির্ভাবের আগে java.util.concurrent, আমি নিয়মিত যে সাধারণ সমস্যাটি ছড়িয়ে দিয়েছিলাম তা হ'ল আমি "থ্রেড-থ্র্যাশিং": অ্যাপ্লিকেশনগুলি যা সম্মিলনের জন্য থ্রেড ব্যবহার করে, তবে সেগুলির মধ্যে অনেকগুলি স্প্যান করে এবং থ্র্যাশিংয়ে শেষ হয়।


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