আমি ++ কেন পারমাণবিক নয়?


97

কেন i++জাভাতে পারমাণবিক না?

জাভাতে আরও গভীর হওয়ার জন্য আমি কতবার থ্রেডে লুপটি কার্যকর করা হয় তা গণনা করার চেষ্টা করেছি।

সুতরাং আমি একটি ব্যবহার

private static int total = 0;

প্রধান ক্লাসে।

আমার দুটি থ্রেড আছে

  • থ্রেড 1: মুদ্রণ System.out.println("Hello from Thread 1!");
  • থ্রেড 2: প্রিন্ট System.out.println("Hello from Thread 2!");

এবং আমি থ্রেড 1 এবং থ্রেড 2 দ্বারা মুদ্রিত রেখাগুলি গণনা করি তবে থ্রেড 1 + থ্রেড 2 এর লাইনগুলি মুদ্রিত আউটগুলির মোট সংখ্যার সাথে মেলে না।

আমার কোডটি এখানে:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {

    private static int total = 0;
    private static int countT1 = 0;
    private static int countT2 = 0;
    private boolean run = true;

    public Test() {
        ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
        newCachedThreadPool.execute(t1);
        newCachedThreadPool.execute(t2);
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        run = false;
        try {
            Thread.sleep(1000);
        }
        catch (InterruptedException ex) {
            Logger.getLogger(Test.class.getName()).log(Level.SEVERE, null, ex);
        }
        System.out.println((countT1 + countT2 + " == " + total));
    }

    private Runnable t1 = new Runnable() {
        @Override
        public void run() {
            while (run) {
                total++;
                countT1++;
                System.out.println("Hello #" + countT1 + " from Thread 2! Total hello: " + total);
            }
        }
    };

    private Runnable t2 = new Runnable() {
        @Override
        public void run() {
            while (run) {
                total++;
                countT2++;
                System.out.println("Hello #" + countT2 + " from Thread 2! Total hello: " + total);
            }
        }
    };

    public static void main(String[] args) {
        new Test();
    }
}

14
আপনি কেন চেষ্টা করবেন না AtomicInteger?
ব্রজ


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

14
আপনি কেন এটি পরমাণু হওয়ার আশা করবেন?
হট লিকস

4
@ সিলি ফ্রাক: এমনকি iincক্ষেত্রগুলির জন্য কোনও নির্দেশনা থাকলেও , একক নির্দেশনা থাকলেও পারমাণবিকতার গ্যারান্টি হয় না, উদাহরণস্বরূপ, অবিবাহিত volatile longএবং doubleক্ষেত্রের অ্যাক্সেস কোনও একক বাইটকোড নির্দেশনা দ্বারা সম্পাদিত হয়েছে তা নির্বিশেষে পারমাণবিক হওয়ার নিশ্চয়তা নেই।
হলগার

উত্তর:


125

i++সম্ভবত জাভাতে পারমাণবিক নয় কারণ পারমাণবিকতা একটি বিশেষ প্রয়োজনীয়তা যা ব্যবহারের বেশিরভাগ ক্ষেত্রে উপস্থিত নেই i++। এই প্রয়োজনীয়তার একটি উল্লেখযোগ্য ওভারহেড রয়েছে: একটি ইনক্রিমেন্ট অপারেশন পারমাণবিক তৈরিতে বড় ব্যয় হয়; এটি সফ্টওয়্যার এবং হার্ডওয়্যার উভয় স্তরে সিঙ্ক্রোনাইজেশন জড়িত যেগুলি একটি সাধারণ বর্ধিতকরণের জন্য উপস্থিত হওয়ার প্রয়োজন নেই।

আপনি সেই যুক্তিটি তৈরি করতে পারেন যা i++পরমাণু বৃদ্ধির জন্য বিশেষভাবে নকশাকৃত ও নথিবদ্ধ হওয়া উচিত ছিল, যাতে কোনও অ-পরমাণু বৃদ্ধি ব্যবহার করে সম্পাদিত হয় i = i + 1। তবে এটি জাভা এবং সি এবং সি ++ এর মধ্যে "সাংস্কৃতিক সামঞ্জস্যতা" ভেঙে দেবে। পাশাপাশি, এটি এমন একটি সুবিধাজনক স্বরলিপিও সরিয়ে নেবে যা সি-জাতীয় ভাষার সাথে পরিচিত প্রোগ্রামাররা এটিকে বিশেষ অর্থ প্রদান করবে যা কেবলমাত্র সীমিত পরিস্থিতিতে প্রযোজ্য।

বেসিক সি বা সি ++ কোড for (i = 0; i < LIMIT; i++)জাভা হিসাবে অনুবাদ করতে হবে for (i = 0; i < LIMIT; i = i + 1); কারণ এটি পারমাণবিক ব্যবহার করা অনুচিত হবে i++। সবচেয়ে খারাপ বিষয়, সি বা অন্যান্য সি-জাতীয় ভাষা থেকে জাভাতে আসা প্রোগ্রামাররা i++যেভাবেই ব্যবহার করতে পারত , ফলে পরমাণু নির্দেশাবলীর অযথা ব্যবহার হত ।

এমনকি মেশিন নির্দেশ সেট স্তরেও, একটি ইনক্রিমেন্ট টাইপ অপারেশন কার্য সম্পাদনের কারণে সাধারণত পারমাণবিক হয় না। incউপরের মত একই কারণে নির্দেশকে পারমাণবিক করতে x86-এ একটি বিশেষ নির্দেশ "লক প্রিফিক্স" ব্যবহার করতে হবে । যদি incসর্বদা পারমাণবিক হয় তবে অ-পারমাণবিক ইনক প্রয়োজন হলে এটি কখনই ব্যবহৃত হত না; প্রোগ্রামারস এবং সংকলকগণ কোড তৈরি করে যা লোড করে, 1 এবং স্টোর যুক্ত করে, কারণ এটি দ্রুততর হবে।

কিছু ইনস্ট্রাকশন সেট আর্কিটেকচারে কোনও পারমাণবিক incবা সম্ভবত কিছু নেই inc; MIPS উপর একটি পারমাণবিক Inc করতে হবে, আপনি একটি সফ্টওয়্যার লুপ যা ব্যবহার লিখতে হবে llএবং scলোড লিঙ্ক, এবং দোকান-শর্তাধীন। লোড-লিঙ্কযুক্ত শব্দটি পড়ে এবং শর্তটি শর্তযুক্ত নতুন শব্দটি সংরক্ষণ করে যদি শব্দটি পরিবর্তন না হয়, অন্যথায় এটি ব্যর্থ হয় (যা সনাক্ত হয়ে যায় এবং পুনরায় চেষ্টা করার কারণ হয়)।


4
যেহেতু জাভাটির কোনও পয়েন্টার নেই, স্থানীয় ভেরিয়েবলগুলি বাড়ানো সহজাতভাবে থ্রেড সেভ হয়, তাই লুপগুলির সাহায্যে সমস্যাটি বেশিরভাগ খারাপ হয় না। আপনার বক্তব্যটি অবশ্যই অবাক করে দেয় অবাক করে দেয় অবশ্যই। এছাড়াও, এটি যেমন হিসাবে i = i + 1অনুবাদ করা হবে ++i, তা নয়i++
সিলি ফ্রিক

22
প্রশ্নের প্রথম শব্দটি "কেন"। এখন পর্যন্ত, "কেন" ইস্যুটি সম্বোধনের একমাত্র উত্তর এটি। অন্যান্য উত্তরগুলি সত্যই কেবল প্রশ্নটি আবার স্থির করে। সুতরাং +1।
দাউদ ইবনে কেরেম

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

4
@ ডেভিডওয়ালেস মানে না ++? ;)
ড্যান হ্লেভেনকা

36

i++ দুটি অপারেশন জড়িত:

  1. বর্তমান মান পড়ুন i
  2. মান বৃদ্ধি এবং এটি বরাদ্দ i

যখন দুটি থ্রেড i++একই সময়ে একই চলকতে সঞ্চালন করে, তারা উভয় একই বর্তমান মান পেতে পারে iএবং তারপরে বৃদ্ধি এবং সেট করতে পারে i+1, সুতরাং আপনি দুটিয়ের পরিবর্তে একক বৃদ্ধি পাবেন।

উদাহরণ:

int i = 5;
Thread 1 : i++;
           // reads value 5
Thread 2 : i++;
           // reads value 5
Thread 1 : // increments i to 6
Thread 2 : // increments i to 6
           // i == 6 instead of 7

(এমনকি যদি পারমাণবিক i++ ছিল তবে এটি সঠিকভাবে সংজ্ঞায়িত / থ্রেড-নিরাপদ আচরণ হবে না))
ব্যবহারকারী 2864740

15
+1, তবে "1. এ, ২ বি এবং সি" দুটি নয়, তিনটি অপারেশন বলে মনে হচ্ছে। :)
ysavit

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

4
@ অ্যাকোয়ারলে - যদি দু'জন প্রসেসর একই স্টোরেজ অবস্থানের বিরুদ্ধে একই অভিযান পরিচালনা করে এবং সেই স্থানে কোনও "রিজার্ভ" সম্প্রচারিত না হয়, তবে তারা অবশ্যই হস্তক্ষেপ করবে এবং বোগাস ফলাফল দেবে। হ্যাঁ, এই অপারেশনটি "নিরাপদ" হওয়া সম্ভব, তবে এটি হার্ডওয়ার স্তরেও বিশেষ প্রচেষ্টা গ্রহণ করে।
হট লিকস

6
তবে আমি মনে করি প্রশ্নটি "কেন" এবং "কী ঘটে" নয়।
সেবাস্তিয়ান মাচ

11

জেভিএমের বিভিন্ন বাস্তবায়ন কীভাবে ভাষার একটি নির্দিষ্ট বৈশিষ্ট্য প্রয়োগ করতে পারে বা না পারে তার চেয়ে গুরুত্বপূর্ণ বিষয়টি জেএলএস (জাভা ল্যাঙ্গুয়েজ স্পেসিফিকেশন)। জেএলএস 15+4 অনুচ্ছেদে ++ পোস্টফিক্স অপারেটরকে সংজ্ঞায়িত করেছে যা বলে যে ia "মান 1 ভেরিয়েবলের মানতে যোগ করা হয় এবং যোগফলটি ভেরিয়েবলের মধ্যে আবার জমা হয়"। এটি কোথাও মাল্টিথ্রেডিং বা পারমাণবিকতার উল্লেখ বা ইঙ্গিত দেয় না। এগুলির জন্য জেএলএস অস্থির এবং সিঙ্ক্রোনাইজড সরবরাহ করে । অতিরিক্তভাবে, java.util.concurrent.atomic প্যাকেজটি রয়েছে (দেখুন http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/atomic/package-summary.html )


5

আই ++ জাভাতে কেন পারমাণবিক নয়?

আসুন ইনক্রিমেন্ট অপারেশনকে একাধিক বিবৃতিতে ভাঙ্গি:

থ্রেড 1 এবং 2:

  1. স্মৃতি থেকে মোট মান আনুন
  2. মান 1 যোগ করুন
  3. স্মৃতি ফিরে লিখুন

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


4
এটি কীভাবে প্রশ্নের উত্তর হওয়া উচিত তা আমি পাই না। একটি ভাষা যেকোন বৈশিষ্ট্যকে পারমাণবিক হিসাবে সংজ্ঞায়িত করতে পারে, তা ইনক্রিমেন্ট বা ইউনিকর্নস হোক। আপনি কেবল পারমাণবিক না হওয়ার একটি পরিণতির উদাহরণ দিয়েছিলেন।
সেবাস্তিয়ান মাচ

হ্যাঁ একটি ভাষা যে কোনও বৈশিষ্ট্যকে পারমাণবিক হিসাবে সংজ্ঞায়িত করতে পারে তবে যতদূর জাভাটিকে ইনক্রিমেন্ট অপারেটর হিসাবে বিবেচনা করা হয় (যা ওপি পোস্ট করা প্রশ্ন) এটি পারমাণবিক নয় এবং আমার উত্তরগুলির কারণগুলি উল্লেখ করে।
অনিকেত ঠাকুর 16 ই

4
(প্রথম মন্তব্যে আমার রূ .় সুরের জন্য দুঃখিত) তবে তার পরে কারণটি মনে হচ্ছে "কারণ এটি যদি পারমাণবিক হয় তবে কোনও জাতি শর্ত থাকত না"। অর্থাত্, এটির মতো শোনাচ্ছে যেন কোনও রেসের অবস্থা কাম্য।
সেবাস্তিয়ান মাচ

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

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

5

i++ একটি বিবৃতি যা কেবল 3 টি অপারেশন জড়িত:

  1. বর্তমান মান পড়ুন
  2. নতুন মান লিখুন
  3. নতুন মান সংরক্ষণ করুন

এই তিনটি অপারেশনকে একক পদক্ষেপে নির্বাহ করা বা অন্য কথায় i++কোনও যৌগিক ক্রিয়াকলাপ নয়। ফলস্বরূপ যখন একাধিক থ্রেড একক তবে অ যৌগিক ক্রিয়াকলাপে জড়িত থাকে তখন সমস্ত ধরণের জিনিস ভুল হতে পারে।

নিম্নলিখিত পরিস্থিতিতে বিবেচনা করুন:

সময় 1 :

Thread A fetches i
Thread B fetches i

সময় 2 :

Thread A overwrites i with a new value say -foo-
Thread B overwrites i with a new value say -bar-
Thread B stores -bar- in i

// At this time thread B seems to be more 'active'. Not only does it overwrite 
// its local copy of i but also makes it in time to store -bar- back to 
// 'main' memory (i)

সময় 3 :

Thread A attempts to store -foo- in memory effectively overwriting the -bar- 
value (in i) which was just stored by thread B in Time 2.

Thread B has nothing to do here. Its work was done by Time 2. However it was 
all for nothing as -bar- was eventually overwritten by another thread.

এবং সেখানে আপনি এটা আছে। একটি জাতি শর্ত।


এজন্যই i++পারমাণবিক নয়। যদি এটি হয় তবে এগুলির fetch-update-storeকোনওটিই ঘটবে না এবং প্রতিটিই পরমাণুভাবে ঘটবে। AtomicIntegerআপনার ক্ষেত্রে এটি ঠিক তাই এবং এটি সম্ভবত সঠিকভাবে মাপসই হবে।

পুনশ্চ

Issues সমস্ত বিষয়কে coveringেকে দেওয়ার জন্য একটি দুর্দান্ত বই এবং তারপরে কয়েকটি হ'ল: অনুশীলনে জাভা কনকুরেন্সি


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

নিখুঁতভাবে তবে আমি আরও উল্লেখ করেছি যে এটি কোনও একক অপারেশন নয় যা বর্ধনের মাধ্যমে বোঝায় যে এ জাতীয় একাধিক অপারেশনগুলিকে পরমাণুতে পরিণত করার জন্য গণনা ব্যয় অনেক বেশি ব্যয়বহুল যা পরিবর্তিতভাবে i++পারমাণবিকভাবে প্রমাণিত হয় কেন কেন পারমাণবিক নয়।
kstratis

4
আমি যখন আপনার বক্তব্যটি পেয়েছি তখন আপনার উত্তরটি কিছুটা বিভ্রান্তিকর। আমি একটি উদাহরণ দেখছি, এবং একটি উপসংহারে বলা হয়েছে যে "উদাহরণের পরিস্থিতির কারণে"; imho এটি একটি অসম্পূর্ণ যুক্তি :(
সেবাস্তিয়ান মাচ

4
@ ফ্রেসনেল সম্ভবত সবচেয়ে প্যাডাগজিকাল উত্তর না হলেও এটি বর্তমানে আমি দিতে পারার সেরা। আশা করি এটি লোককে সহায়তা করবে এবং তাদের বিভ্রান্ত করবে না। সমালোচনা করার জন্য ধন্যবাদ। আমি আমার ভবিষ্যতের পোস্টগুলিতে আরও সুনির্দিষ্ট হওয়ার চেষ্টা করব।
kstratis

2

জেভিএম-তে, একটি ইনক্রিমেন্টে একটি পঠন এবং একটি লিখন জড়িত, সুতরাং এটি পারমাণবিক নয়।


2

অপারেশনটি যদি i++পারমাণবিক হয় তবে আপনি এটির থেকে মূল্য পড়ার সুযোগ পাবেন না। এটি ব্যবহার করে ঠিক কী করতে চান i++( ব্যবহারের পরিবর্তে ++i)।

উদাহরণস্বরূপ নিম্নলিখিত কোডটি দেখুন:

public static void main(final String[] args) {
    int i = 0;
    System.out.println(i++);
}

এক্ষেত্রে আমরা আউটপুটটি আশা করি: 0 (কারণ আমরা ইনক্রিমেন্ট পোস্ট করি, যেমন প্রথম পড়া, তারপরে আপডেট)

অপারেশনটি পারমাণবিক না হতে পারে এটির একটি কারণ, কারণ আপনাকে মানটি পড়তে হবে (এবং এটি দিয়ে কিছু করতে হবে) এবং তারপরে মানটি আপডেট করতে হবে।

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


4
এটি বিভ্রান্তিকর। আপনাকে পৃথক কার্যকর করতে হবে এবং ফলাফল পেতে হবে, অন্যথায় আপনি কোনও পারমাণবিক ক্রিয়াকলাপ থেকে মান পেতে পারেন না ।
সেবাস্তিয়ান মাচ

না এটি নয়, সে কারণেই জাভার অ্যাটমিকআইন্টিজারের একটি গেট (), getAndIncrement (), getAndDecrement (), ইনক্রিমেন্টএন্ডগেট (), হ্রাস-এন্ডগেট () ইত্যাদি রয়েছে
রায় ভ্যান রিজন

4
এবং জাভা-ভাষাটি i++প্রসারিত হওয়ার সংজ্ঞা দিতে পারত i.getAndIncrement()। এ জাতীয় সম্প্রসারণ নতুন নয়। উদাহরণস্বরূপ, সি ++ এ ল্যাম্বডাস বেনাম শ্রেণীর সংজ্ঞাগুলিতে সি ++ তে প্রসারিত করা হয়।
সেবাস্তিয়ান মাচ

একটি পরমাণু দেওয়া i++তুচ্ছভাবে একটি পারমাণবিক ++iবা তদ্বিপরীত তৈরি করতে পারে। একটি অন্য প্লাস একের সমতুল্য।
ডেভিড শোয়ার্টজ

2

দুটি পদক্ষেপ রয়েছে:

  1. আমি স্মৃতি থেকে আনুন
  2. i + 1 থেকে i সেট করুন

সুতরাং এটি পারমাণবিক অপারেশন নয়। থ্রেড 1 যখন আই ++ চালায় এবং থ্রেড 2 আই ++ চালায় তখন আমার চূড়ান্ত মান i + 1 হতে পারে।


-1

কনক্যুরঞ্জি ( Threadশ্রেণি এবং এ জাতীয়) জাভা এর v1.0 এ একটি অতিরিক্ত বৈশিষ্ট্য । i++এর আগে বিটাতে যুক্ত করা হয়েছিল এবং এটি এর (আরও বা কম) মূল বাস্তবায়নের ক্ষেত্রে সম্ভবত এখনও আরও বেশি।

ভেরিয়েবলগুলি সিঙ্ক্রোনাইজ করার জন্য এটি প্রোগ্রামারটির উপর নির্ভর করে। এটি সম্পর্কে ওরাকলের টিউটোরিয়ালটি দেখুন

সম্পাদনা: স্পষ্ট করার জন্য, আই ++ হ'ল জাভাটির পূর্বাভাস দেয় এমন একটি সংজ্ঞায়িত পদ্ধতি এবং যেমন জাভার ডিজাইনাররা সেই পদ্ধতির মূল কার্যকারিতা রাখার সিদ্ধান্ত নিয়েছিলেন।

বি + (1969) এ ++ অপারেটরটি সংজ্ঞায়িত করা হয়েছিল যা জাভা এবং থ্রেডিংয়ের পূর্বে কেবল একটি বাচ্চার দ্বারা আবদ্ধ হয়।


-1 "সার্বজনীন শ্রেণির থ্রেড ... যেহেতু: জেডিকে ১.০" উত্স: docs.oracle.com/javase/7/docs/api/index.html?java/lang/…
সিলি ফ্রিক

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

5
কী গুরুত্বপূর্ণ তা আপনার উত্সটি "থ্রেড শ্রেণীর আগে এটি প্রয়োগ করা হয়েছিল" উত্স দ্বারা সমর্থন করা হয়নি। i++পারমাণবিক না হওয়া একটি ডিজাইনের সিদ্ধান্ত, ক্রমবর্ধমান সিস্টেমে কোনও তদারকি নয়।
সিলি ফ্রিক

হ্যাঁ সুন্দর। i ++ থ্রেডসের আগে ভালভাবে সংজ্ঞায়িত করা হয়েছিল, কেবল জাভাটির আগে ভাষা ছিল বলে ভাষা ছিল। জাভার নির্মাতারা ভালভাবে গৃহীত পদ্ধতির নতুন সংজ্ঞা দেওয়ার পরিবর্তে সেই অন্যান্য ভাষাগুলিকে বেস হিসাবে ব্যবহার করেছিলেন। আমি কখনই বললাম এটি একটি তদারকি ছিল?
দ্য ব্যাট

: @SillyFreak এখানে কিছু সূত্র যে দেন বয়স কত ++, হয় en.wikipedia.org/wiki/Increment_and_decrement_operators en.wikipedia.org/wiki/B_(programming_language)
TheBat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.