Develop #1

Open
Mobina wants to merge 2 commits from develop into main
2 changed files with 96 additions and 4 deletions
Showing only changes of commit 86882ca197 - Show all commits
+43
View File
@@ -0,0 +1,43 @@
1 -
زمانی که میخواهیم عملیات های ساده روی یک متغیر داخل thread انجام دهیم یک شیئ atomic variable داخل آن نخ میسازیم و برای انجام عملیات از توابع داخل آن کلاس استفاده میکنیم.
این متغیر ها این خصوصیت را دارند که هنگامی که عملیاتی روی آن درحال اجراست thread دیگری اجرا نمیشود در نتیجه در محاسبه مقدار خطا ایجاد نمیشود.
2 -
AtomicInteger, AtomicLong, AtomicBoolean, AtomicReference<T>
3 - Compare locks with atomic variables.
متغیر های اتمی برای عملیات های ساده استفاده میشود اما قفل برای عملیات های پیچیده تر استفاده میشود و برای چند متغیر استفاده میشود.
🎯Bonus Task:
import java.util.concurrent.atomic.AtomicInteger;
public class AtomicDemo {
private static int normalCounter = 0;
private static AtomicInteger atomicCounter = new AtomicInteger(0);
public static void main(String[] args) throws InterruptedException {
Thread[] threads = new Thread[10];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(() -> {
for (int j = 0; j < 10000; j++) {
normalCounter++;
atomicCounter.incrementAndGet();
}
});
}
for (Thread t : threads) {
t.start();
}
for (Thread t : threads) {
t.join();
}
System.out.println( normalCounter);
System.out.println( atomicCounter.get());
}
}
@@ -4,6 +4,7 @@ public class BankAccount {
private final int accountId; private final int accountId;
private long balance; private long balance;
private final ReentrantLock lock = new ReentrantLock();
/* /*
* Students may introduce additional fields * Students may introduce additional fields
@@ -32,7 +33,16 @@ public class BankAccount {
* - Should not block unnecessarily if using read/write locks * - Should not block unnecessarily if using read/write locks
*/ */
public long getBalance() { public long getBalance() {
throw new UnsupportedOperationException("TODO: implement thread-safe balance read");
lock.lock();
try{
return balance;
}finally {
lock.unlock();
}
} }
/* /*
@@ -43,7 +53,14 @@ public class BankAccount {
* - Must not lose updates under concurrency * - Must not lose updates under concurrency
*/ */
public void deposit(long amount) { public void deposit(long amount) {
throw new UnsupportedOperationException("TODO: implement thread-safe deposit");
lock.lock();
try{
balance+=amount;
}finally {
lock.unlock();
}
} }
/* /*
@@ -56,7 +73,12 @@ public class BankAccount {
* to extend the system (optional) * to extend the system (optional)
*/ */
public void withdraw(long amount) { public void withdraw(long amount) {
throw new UnsupportedOperationException("TODO: implement thread-safe withdraw"); lock.lock();
try{
balance-=amount;
}finally {
lock.unlock();
}
} }
/* /*
@@ -73,6 +95,33 @@ public class BankAccount {
* - Or tryLock with retry strategy * - Or tryLock with retry strategy
*/ */
public void transfer(BankAccount target, long amount) { public void transfer(BankAccount target, long amount) {
throw new UnsupportedOperationException("TODO: implement atomic deadlock-free transfer"); BankAccount first;
BankAccount second;
if (this == target) {
return;
}
if (this.getAccountId() < target.getAccountId()) {
first = this;
second = target;
} else {
first = target;
second = this;
}
first.lock.lock();
try {
second.lock.lock();
try {
this.balance -= amount;
target.balance += amount;
} finally {
second.lock.unlock();
}
} finally {
first.lock.unlock();
}
} }
} }