Я новичок в программировании потоков на Java.Чтобы понять потоки, я пытаюсь написать простую программу для симуляции банковского счета.Я только что осуществил вывод и пытаюсь проверить его.Первые несколько строк вывода ниже.
Баланс до снятия Т2: 1000Баланс после снятия Т2: 990Баланс до снятия Т1: 1000Баланс после снятия Т1: 980Баланс до снятия Т2: 980Баланс после снятия Т2: 970Баланс до снятия Т1: 970Баланс после снятия Т1: 960
Мой вопрос заключается в том, почему строка 3 (Баланс до снятия Т1: 1000) в выходных данных дает 1000 вместо 990. Если это было правильно, это должно быть в строке 2. Я что-то упустил.Мой подход правильный?
Я предполагаю, что оба потока, пытающихся записать данные для записи на консоль, и поток T1 просто не получили возможности записать его во второй строке.
class BankAccount {
private volatile int balance;
public BankAccount(int b){
balance = b;
}
public BankAccount(){
balance = 0;
}
synchronized public int getBalance(){
return balance;
}
synchronized public int withdraw(int w)
{
int b = getBalance();
if(w <= b){
balance = balance-w;
return w;
}
else
return 0;
}
}
class WithdrawAccount implements Runnable{
private BankAccount acc;
private int amount;
public WithdrawAccount(){
acc = null;
amount = 0;
}
public WithdrawAccount(BankAccount acc,int amount){
this.acc = acc;
this.amount = amount;
}
public void run() {
int w;
for(int i =0; i<20; i++){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Balance before "+Thread.currentThread().getName()+" withdrawl: "+acc.getBalance());
w = acc.withdraw(amount);
System.out.println("Balance after "+Thread.currentThread().getName()+" withdrawl: "+acc.getBalance());
//System.out.println("amount with drawn by: "+Thread.currentThread().getName()+" "+w);
}
}
}
public class TestBankAccount{
public static void main(String[] args) {
BankAccount b = new BankAccount(1000);
WithdrawAccount w = new WithdrawAccount(b,10);
Thread wt1 = new Thread(w);
wt1.setName("T1");
Thread wt2 = new Thread(w);
wt2.setName("T2");
wt1.start();
wt2.start();
}
}