Programowanie współbieżne w języku Java
Programowanie współbieżne w języku Java
Programowanie współbieżne w języku Java
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Zadanie, w którym występuje błąd współbieżności (<strong>Java</strong> Specialists’ Newsletter 155).<br />
public class BankAccount {<br />
private int balance;<br />
public BankAccount(int balance) {<br />
this.balance = balance;<br />
}<br />
public void deposit(int amount) {<br />
balance += amount;<br />
}<br />
public void withdraw(int amount) {<br />
deposit(-amount);<br />
}<br />
public int getBalance() {<br />
return balance;<br />
}<br />
}<br />
=================================================================<br />
import java.util.concurrent.*;<br />
public class BankAccountTest {<br />
public static void main(String[] args) {<br />
final BankAccount account = new BankAccount(1000);<br />
for (int i = 0; i < 2; i++) {<br />
new Thread() {<br />
{<br />
start();<br />
}<br />
}<br />
}<br />
public void run() {<br />
while (true) {<br />
account.deposit(100);<br />
account.withdraw(100);<br />
}<br />
}<br />
};<br />
}<br />
ScheduledExecutorService timer =<br />
Executors.newSingleThreadScheduledExecutor();<br />
timer.scheduleAtFixedRate(new Runnable() {<br />
public void run() {<br />
System.out.println(account.getBalance());<br />
}<br />
}, 1, 1, TimeUnit.SECONDS);<br />
Użycie opcje kompilatora języka <strong>Java</strong>:<br />
o -client hotspot<br />
o -server hotspot (znacznie silniejsza optymalizacja kodu).<br />
Wprowadzenie deklaracji volatile dla zmiennej balance z klasy BankAccount.<br />
Wprowadzenie zmiennej typu AtomicInteger. w klasie BankAccount .<br />
import java.util.concurrent.atomic.AtomicInteger;<br />
public class BankAccount {<br />
private final AtomicInteger balance =<br />
new AtomicInteger();<br />
}<br />
public BankAccount(int balance) {<br />
this.balance.set(balance);<br />
}<br />
public void deposit(int amount) {<br />
balance.addAndGet(amount);<br />
}<br />
public void withdraw(int amount) {<br />
deposit(-amount);<br />
}<br />
public int getBalance() {<br />
return balance.intValue();<br />
}<br />
Lab. „<strong>Programowanie</strong> <strong>współbieżne</strong> w <strong>języku</strong> <strong>Java</strong>”<br />
3