Auf Thema antworten

Vielen Dank! :)


Ich habe total vergessen das es die Möglichkeit gibt einen synchronized-Block zu erstellen und ein bestimmtes Objekt zu blocken...


Hier die Änderungen an den entsprechenden Klassen:


[code=Java]

import java.util.logging.Level;

import java.util.logging.Logger;


public class Writer extends Thread {


    private Stack stackref = null;


    public Writer(Stack stackref) {

        this.stackref = stackref;

    }


    @Override

    public void run() {

        int zahl;


        for (int i = 0; i < 10; i++) {

            zahl = (int) (Math.random() * 10);


            synchronized (stackref) {

                try {

                    stackref.push(zahl);

                } catch (OverflowException ex) {

                    System.out.println("Writer: " + ex.getMessage());

                }


                System.out.print("Writer ~ print(): ");

                stackref.print();

            }


            try {

                sleep(3);

            } catch (InterruptedException ex) {

                Logger.getLogger(Writer.class.getName()).log(Level.SEVERE, null, ex);

            }

        }

    }

}

[/code]


[code=Java]

import java.util.logging.Level;

import java.util.logging.Logger;


public class Reader extends Thread {


    private Stack stackref = null;


    public Reader(Stack stackref) {

        this.stackref = stackref;

    }


    @Override

    public void run() {

        while (true) {

            synchronized (stackref) {

                System.out.print("Reader ~ print(): ");

                stackref.print();


                try {

                    System.out.println("pop(): " + stackref.pop());

                } catch (UnderflowException ex) {

                    System.out.println("Reader: " + ex.getMessage());

                }

            }


            try {

                sleep(3);

            } catch (InterruptedException ex) {

                Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);

            }

        }

    }

}

[/code]


Kleine Frage aber noch...

NetBeans gibt mir eine Warnung aus, weil das Objekt "stackref" nicht final ist...

Ich kann mir schon denken das er mich Warnt weil es sein könnte dass zB bei einem lock dieses Objekt von wo anders geändert wird und stackref auf was anderes verweist...


Aber ist es nun "unschön" ein nicht final Objekt bei synchronized zu nutzen oder ist das einfach nur "aber bitte vergiss nicht das ..." ?


Danke!



Oben