آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

Saeed Mozaffari  9 سال پیش  9 سال پیش
0 0

سلام

 

فرض کنید چندتا 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 تاثیر میزارن ، دیگه با هم تداخل نداشته باشن؟

0 0
برای محاسبات متوالی و در مواقعی که نتیجه به انجام یافتن عمل قبلی وابسته است بجای thread از asynctask استفاده کنید بهتر نتیجه می‌گیرید ٬ نمونه ای از کار با asynctask در آموزش های استاد بود و همچنین می توانید جستجو کنید (9 سال پیش)
0 0
راه حل ساده برای مورد مطرح شده استفاده از AtomicInteger به جای int یا integer هست. راه دیگه استفاده از synchronized block و قفل کردن متغیر هست. (9 سال پیش)
0 0
* قفل کردن آبجکت (9 سال پیش)
 برای این سوال 1 پاسخ وجود دارد.
پاسخ به سوال 
Saeed Mozaffari  9 سال پیش
+1 0


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