بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

همگام سازی دو thread با همدیگر

مدیریت گفتگو
Saeed Mozaffari 10 سال پیش
آخرین تغییر: 10 سال پیش

سلام

 

فرض کنید چندتا thread داریم که همشون رویه یه object دارن تاثیر میزارن ; مثلا به کد زیر دقت کنید

  Thread thread1 = new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
thread1.start();

Thread thread2 = new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
thread2.start();

Thread thread3 = new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
thread3.start();

Thread thread4 = new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
thread4.start();

Thread thread5 = new Thread(new Runnable() {

@Override
public void run() {
for (int i = 0; i < 10000; i++) {
count++;
}
}
});
thread5.start();

 

در کد بالا پنج thread داریم که هر پنج thread دارن  یک عدد رو اضافه میکنن ، ولی در پایان محاسباتشون با اینکه پنج تا حلقه 10000تایی داشتیم ، عددمون 50000 نمیشه ، مثلا یه چیزی میشه حدود0 20،30 و یا 40 هزارتا . یعنی یه سری از اضافه شدن ها به خاطر همزمان شدن یه جورایی duplicate شدن و همزمانی اینها باعث از دست رفتن یه سری از اطلاعات میشه، متاسفانه!

 

حالا چطور میشه چند تا thread رو طوری همگام سازی کرد که وقتی همزمان دارن رویه یه object تاثیر میزارن ، دیگه با هم تداخل نداشته باشن؟

نظرات

hamcalas 10 سال پیش
برای محاسبات متوالی و در مواقعی که نتیجه به انجام یافتن عمل قبلی وابسته است بجای thread از asynctask استفاده کنید بهتر نتیجه می‌گیرید ٬ نمونه ای از کار با asynctask در آموزش های استاد بود و همچنین می توانید جستجو کنید
hamidd 10 سال پیش
راه حل ساده برای مورد مطرح شده استفاده از AtomicInteger به جای int یا integer هست. راه دیگه استفاده از synchronized block و قفل کردن متغیر هست.
hamidd 10 سال پیش
* قفل کردن آبجکت

پاسخ‌ها 1

Saeed Mozaffari 10 سال پیش

نظرات


پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .