Я собрал некоторый Java-код, который демонстрирует тупик в потоке. По своей сути я обычно получаю 2 строки вывода и исключение, иногда до и иногда после выходных строк, которые ожидаются. Исключением, которое я получаю, является исключение NullPointerException в первой строке метода transfer().Java Threading - решение тупика?
Проблема, с которой я сталкиваюсь, - это то, что я хотел бы знать, как решить эту проблему взаимоблокировки. Я был поиск по StackOverflow этой проблемы и нашли эту страницу:
Как решения, я пытался, что Уилл Гартунг и что Dreamcash писал, но я все еще получаю исключение при попытке использовать функцию синхронизации или ReentrantLock объект.
Вот код: класс
счета:
public class Account {
int id;
double balance;
public Account(int id, double balance){
this.id = id;
this.balance = balance;
}
public void withdraw(double amount){
balance = balance - amount;
}
public void deposit(double amount){
balance = balance + amount;
}
public int getID(){
return id;
}
public double getBalance(){
return balance;
}
}
Bank Class (одноэлементно):
public class Bank{
static Bank bank;
Account a1;
Account a2;
private Bank(){}
public static Bank getInstance(){
if(bank==null){
bank = new Bank();
bank.setAccountOne(new Account(1, 100));
bank.setAccountTwo(new Account(2, 100));
}
return bank;
}
public void transfer(Account from, Account to, double amount){
from.withdraw(amount);
to.deposit(amount);
}
public Account getAccountOne(){
return a1;
}
public Account getAccountTwo(){
return a2;
}
public void setAccountOne(Account acc){
a1 = acc;
}
public void setAccountTwo(Account acc){
a2 = acc;
}
}
PersonOne класс:
Классpublic class PersonOne implements Runnable {
public void run() {
Bank bank = Bank.getInstance();
Account a1 = bank.getAccountOne();
Account a2 = bank.getAccountTwo();
bank.transfer(a2, a1, 10);
System.out.println("T1: New balance of A1 is " + a1.getBalance());
System.out.println("T1: New balance of A2 is " + a2.getBalance());
}
}
PersonTwo:
public class PersonTwo implements Runnable {
public void run() {
Bank bank = Bank.getInstance();
Account a1 = bank.getAccountOne();
Account a2 = bank.getAccountTwo();
bank.transfer(a1, a2, 10);
System.out.println("T2: New balance of A1 is " + a1.getBalance());
System.out.println("T2: New balance of A2 is " + a2.getBalance());
}
}
И, наконец, мой основной метод
public static void main(String[] args){
PersonOne p1 = new PersonOne();
PersonTwo p2 = new PersonTwo();
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
t1.start();
t2.start();
}
Где ваши реализации с использованием Lock? Также вы можете посмотреть на атомарные типы данных. –
какие исключения ??? – UmNyobe
Где синхронизированные блоки? –