07.03.2014 Views

Programowanie współbieżne w języku Java

Programowanie współbieżne w języku Java

Programowanie współbieżne w języku Java

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!