Używam w wielowątkowym programie pola volatile po to, aby dane nie zostały uszkodzone.
Kod programu:
package threads;
import java.util.*;
import java.util.concurrent.locks.*;
/**
*
*/
public class Main
{
public Main()
{
//
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
Cash cash = new Cash(0);
Thread thread1 = new Thread(new Adder(cash));
Thread thread2 = new Thread(new Subtracter(cash));
thread1.start();
thread2.start();
}
}
/**
*
*/
class Cash
{
public Cash(double number)
{
this.number = number;
}
public String toString()
{
return String.valueOf(number);
}
public void setNumber(double number)
{
this.number = number;
}
public double getNumber()
{
return number;
}
private volatile double number;
}
/**
*
*/
abstract class Worker implements Runnable
{
public Worker(Cash cash)
{
this.cash = cash;
}
public void setCash(Cash cash)
{
this.cash = cash;
}
public Cash getCash()
{
return cash;
}
public void run()
{
try
{
for (int i = 0; i < 100; i++)
{
operation();
Thread.sleep(1000);
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
public abstract void operation();
private Cash cash;
}
/**
*
*/
class Adder extends Worker
{
public Adder(Cash cash)
{
super(cash);
}
public void operation()
{
Cash cash = getCash();
System.out.print("do " + cash);
cash.setNumber(cash.getNumber() + 100);
System.out.println(" dodano 100 i otrzymano " + cash.getNumber());
}
}
/**
*
*/
class Subtracter extends Worker
{
public Subtracter(Cash cash)
{
super(cash);
}
public void operation()
{
Cash cash = getCash();
System.out.print("od " + cash);
cash.setNumber(cash.getNumber() - 100);
System.out.println(" odjęto 100 i otrzymano " + cash.getNumber());
}
}
Wydruk:
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
do 0.0 dodano 100 i otrzymano 100.0
od 100.0 odjęto 100 i otrzymano 0.0
od 0.0 odjęto 100 i otrzymano -100.0 /////////////////////////////////////// tu się zaczynają problemy :(
do -100.0 dodano 100 i otrzymano 0.0
od 0.0 odjęto 100 i otrzymano -100.0
do -100.0 dodano 100 i otrzymano 0.0
od 0.0 odjęto 100 i otrzymano -100.0
do -100.0 dodano 100 i otrzymano 0.0
od 0.0 odjęto 100 i otrzymano -100.0
do -100.0 dodano 100 i otrzymano 0.0
Po drobnych przemyśleniach myślę, że pole volatile się w mojej sytuacji nie przyda. Jeśli mam rację to jak to rozwiązać w inny sposób?