PDA

View Full Version : Synchronized methods in different objects,threads



sajjad4563
جمعه 25 بهمن 1392, 23:28 عصر
سلام
تو این کلاس، متدهای مربوط به برداشت و واریز پول نشون داده شده که سنکرونایز هستن


public class BankAccount {

private float blance;

public synchronized void deposit(float amount) {
blance += amount;
}

public synchronized void withdraw(float amount) {
blance -= amount;
}
}


خوب حالا واسه بررسی هاشون دوحالت رو بررسی میکنیم:
حالت 1، فقط یه شی ازین کلاس موجود است ولی توسط ترد های مختلف متد ها فراخوانی میشوند:

حالا آیا ممکنه که مثلا متد deposit بصورت همزمان توسط چند تا ترد با هم و بصورت همزمان اجرا بشه؟ (خود متد با خودش)
آیا ممکنه که متد deposite و متد withdraw توسط تردهای مختلف باهم اجرا شوند؟(همزمان)

حالت 2، چند شی این کلاس موجود است:
در این حالت هم دو سئوال بالا مطرح هست
ایا در همه این چهار حالت، متدهای میتوانند باهم کار کنند یا نه؟

ممنونم

cups_of_java
شنبه 26 بهمن 1392, 15:21 عصر
سینکرونیزیشن روش شی انجام میشه. نه بین شی ها! بنابراین اینکه شما یک شی یا صد شی داشته باشی فرقی نمیکنه.
وقتی متدهایی سینکرونایز میشن یعنی برای هر شی اون متد ها در آن واحد همزمان اجرا نخواهند شد! همین!
بنابراین روی تک تک شی های شما هیچ وقت اون دو تا متد همزمان اجرا نمیشن. یعنی هرکدوم توی هر تردی زودتر اجرا رو گرفت (فراخوانی شد)‌ دیگری صبر میکنه تا تموم شه بعد خودش اجرا شه. این به تفکیک شی هست! یعنی روی شی دیگه هم همینطور...
حالا این دو تا متد باشه یا متد با خودش باشه... هیچ فرقی نمیکنه.

توضیح اینکه اگه تو درس سیستم عامل از مانیتور ها یادت باشه... سینکرونیزیشن توسط مانیتور ها انجام میشه و با قفل گذاری. بنابراین وقتی متدی سینکرونایزد هست موقع اجراش قفل میگیره. اگه قفل آزاد باشه که اجرا میشه و قفل رو بسته نگه میداره در طول اجرا تا دیگران اجراش نکنن. اگرم قفل آزاد نباشه که صبر میکنه دیگه...
اینطوری میشه که اونطوری میشه. حالا اگه واضح نگفتم یا سوالی داری بپرس