statische synchronisation

Status
Nicht offen für weitere Antworten.

hdi

Top Contributor
hallo,

ich les hier gerade eine vorlesung über java, und es geht um threads, race conditions, sowie synchronisation.
also ich verstehe schon das konzept von monitoren auf objekten in java.

jetzt hab ich mich aber gefragt: wie isn das bei statischen methoden, wenn man also quasi kein objekt hat? geht das überhaupt (darauf wird nämlich in der vorlesung nicht eingegangen)

ich hab mir dann mal folgendes programm geschrieben:

Code:
package tests;

public class Main {

    public static int count = 0;
    public static final int MAX = 1000000;

    public static void main(String[] args) {

        new CountThread("t1").start();
        new CountThread("t2").start();
    }
}

class CountThread extends Thread {

    String name;
    int ownCount;

    public CountThread(String string) {

        name = string;
        ownCount = 0;
    }

    @Override
    public void run() {

        increase();
    }

    public void increase() {
        while (Main.count < Main.MAX) {
            Main.count++;
            ownCount++;
        }

        System.out.println(name + ": ownCount " + ownCount + "  /   globalCount " + Main.count);
    }
}

ein ergebis der ausführung ergibt zB:

t2: ownCount 949775 / globalCount 1000000
t1: ownCount 946071 / globalCount 1000000

man sieht hier also deutlich die race condition. aber ich hab ne frage dazu:
die "globalCount" ist IMMER genau 1000000. Ich habe das Programm ca. 100 mal oder öfters getestet.
Erwartet hatte ich eigentlich, dass sie mal 1000001 ist oder noch etwas höher :/
Ist das jetz Zufall? Oder wieso ist es immer genau 1000000 ?

Also ich weiss nicht so recht, bin verwirrt..
Da es von der Syntax her in Java geht, eine statische Methode synchronized zu setzen, muss wohl eine Synchronisation über globale Variablen funktionieren. Aber wie? Oder irre ich mich doch?

dankeschön!
 
S

shad0w

Gast
Die Klasse ist in Java auch ein Objekt. Das bekommst du z.B. mit dem Ausdruck "Main.class" Wenn man eine statische Methode synchronisiert, wird auf diesem Klassen-Objekt synchronisiert.

Dass globalCount bei dir immer 1000000 ist, liegt an der Konstruktion deiner while-Schleife

Code:
        while (Main.count < Main.MAX) {
            Main.count++;
            ownCount++;
        }

Nach Ausführung der Schleife gilt natürlich: Main.count == Main.MAX
 

hdi

Top Contributor
ja, aber Main.count sollte eben wegen race conditions NICHT immer Main.max sein, oder?

Bsp, nehmen wir an:

Main.count = 999999

Thread 1 überprüft die while-Bedingung:

(999999 < 1000000) => TRUE, ist in der schleife

jetzt kommt der scheduler und switcht die prozesse:

Thread 2 überprüft die while-Bedingung:

(999999 < 1000000) => TRUE, ist in der schleife

so, jetzt sind BEIDE in der schleife, wechsel zu thread 1 erhöht count, dann wechsel zu thread 2 erhöht count
auch, also Main.count == 1000001.

Jetz sag mir nich, dass ich nicht recht hab :noe: ^^
 
S

shad0w

Gast
Sorry, bin noch nicht ganz wach gewesen :) Natürlich kann globalCount auch 1000001 werden, das ist reiner Zufall. Erhöhe mal das Maximum auf 10000000, vielleicht siehst du es dann.
 

hdi

Top Contributor
okay, aber das mit klassen synchronisieren hab ich jetz nich ganz verstanden.
was wird denn genau synchronisiert da? die instanzvariablen?

könntest du vllt meinen code umändern, sodass die globale variable Main.count synchronisiert wird,
dass also NICHT 1000001 rauskommen kann?
 
S

shad0w

Gast
Ich bin mir nicht ganz sicher, aber vllt ist es das, was du willst:

Code:
    public synchronized void increase() {
        synchronized (Main.class) {
            while (Main.count < Main.MAX) {
                Main.count++;
                ownCount++;
            }
        }
        System.out.println(name + ": ownCount " + ownCount + "  /   globalCount " + Main.count);
    }

Wenn ein Thread A nun in den synchronized-Block eintritt, dann bekommt er das Lock des Klassenobjekts Main (worin sich die statischen Variablen befinden). Während Thread A da drin ist, kann Thread B nicht den Block betreten, und muss solange warten, bis Thread A den Block verlassen hat. Erst dann führt Thread B den Block aus.
 
S

shad0w

Gast
Oops, das erste synchronized in der Methode gehört weg, so reicht es auch:

Code:
    public void increase() {
        synchronized (Main.class) {
            while (Main.count < Main.MAX) {
                Main.count++;
                ownCount++;
            }
        }
        System.out.println(name + ": ownCount " + ownCount + "  /   globalCount " + Main.count);
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Die statische Main-Methode ändert Instanzvariable? Java Basics - Anfänger-Themen 10
B Attribute eines Objekts einer Klasse durch statische Methode einer 2. Klasse ändern? Java Basics - Anfänger-Themen 32
C Größte Zahl aus einem Array ermitteln(als statische Methode) Java Basics - Anfänger-Themen 31
M Warum dürfen Objekte einer Klasse auf statische Variablen dieser Klasse referenzieren? Java Basics - Anfänger-Themen 10
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
S Klassen statische Objekterzeugung vor Konstruktoraufruf??? Java Basics - Anfänger-Themen 6
Queiser Nicht statische Klassen Java Basics - Anfänger-Themen 6
B Statische Methode return funktioniert nicht. Java Basics - Anfänger-Themen 19
C nicht statische Methoden Java Basics - Anfänger-Themen 4
D statische generische Methoden Java Basics - Anfänger-Themen 3
D Statische Variablen/Methoden Java Basics - Anfänger-Themen 3
S Zufallszahl (Statische Attribute und Methoden) Java Basics - Anfänger-Themen 10
N Auf statische Methode zugreufen Java Basics - Anfänger-Themen 9
R Methoden Nicht statische Methode aus Main aufrufen Java Basics - Anfänger-Themen 2
F Privater Konstruktor und statische Methoden Java Basics - Anfänger-Themen 4
S ActionListener und Statische Variablen Java Basics - Anfänger-Themen 4
D Statische Objekte mit variablem Parameter Java Basics - Anfänger-Themen 1
K Wieso muss man finale statische Variablen sofort oder eben im Konstruktor initialisieren? Java Basics - Anfänger-Themen 2
F Statische Klasse => Flaschenhals? Java Basics - Anfänger-Themen 10
T Statische Arrays von Objekten Java Basics - Anfänger-Themen 2
S Java Fragen Konstruktor & Statische Methoden Java Basics - Anfänger-Themen 4
B Java Programm ohne statische Main Methode aufrufen Java Basics - Anfänger-Themen 5
S Datentypen nicht lineare STATISCHE Datenstruktur? Java Basics - Anfänger-Themen 10
E statische Variable ändert sich Java Basics - Anfänger-Themen 7
A Statische Variable in Methoden Java Basics - Anfänger-Themen 7
P Klassen statische oder dynamische(?) Klasse Java Basics - Anfänger-Themen 3
A Nicht-statische Methode in einer statischen aufrufen Java Basics - Anfänger-Themen 10
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
M Statische Methoden in Interface/Abstrakte Klasse Java Basics - Anfänger-Themen 6
J statische Methoden auf eine LinkedList initialisieren? Java Basics - Anfänger-Themen 5
A statische Arraylist Java Basics - Anfänger-Themen 6
Q Variablen Statische Variablen Java Basics - Anfänger-Themen 8
J Unterschied zwischen statische und nicht statische Methoden? Java Basics - Anfänger-Themen 14
V OOP Statische Klassen-Attribute vererben Java Basics - Anfänger-Themen 4
K Statische Bindung Java Basics - Anfänger-Themen 6
B dynamische/statische Typen Java Basics - Anfänger-Themen 2
L Methoden Auf statische Methode einer anderen Klasse zugreifen, die Array zurückgibt Java Basics - Anfänger-Themen 3
S statische Methode nebenläufig Java Basics - Anfänger-Themen 2
R Aufruf statische Methode Java Basics - Anfänger-Themen 7
M Statische Methoden Java Basics - Anfänger-Themen 22
C Relativer Pfad - Statische Methode Java Basics - Anfänger-Themen 6
A Statische Methode "vererben" - Zwang durch annotation processor Java Basics - Anfänger-Themen 10
sqsh statische jlabels dynamisch verwalten Java Basics - Anfänger-Themen 2
S Statische Klassen/ Singleton Java Basics - Anfänger-Themen 13
E Statische Member können nicht vererbt werden? Java Basics - Anfänger-Themen 10
F Generische Typen auch für statische Methoden? Java Basics - Anfänger-Themen 13
B statische Variable Java Basics - Anfänger-Themen 10
M Statische und nicht-statische Funktionen: Desktop.browse(uri); Java Basics - Anfänger-Themen 4
A Stilfrage: statische Methoden und Attribute auf jeden Fall verhindern? Java Basics - Anfänger-Themen 5
A Stilfrage: statische Variable mit Instanz der gleichen Klasse Java Basics - Anfänger-Themen 8
H Statische generische Methode Java Basics - Anfänger-Themen 2
A statische Attribute: Vererbung und Zugriff darauf Java Basics - Anfänger-Themen 15
hdi Observer als statische Klasse ? Java Basics - Anfänger-Themen 2
G statische ArrayList? Java Basics - Anfänger-Themen 8
K Statische Variablen von Objekten im Array Java Basics - Anfänger-Themen 15
K nicht-statische Methode aufrufen Java Basics - Anfänger-Themen 3
S statische variable initialisieren mit exception Java Basics - Anfänger-Themen 2
G statische Variable zugreifen bzw. setzen Java Basics - Anfänger-Themen 6
T in statischem Kontext auf nicht statische Variable beziehen Java Basics - Anfänger-Themen 5
M Statische Funktion Java Basics - Anfänger-Themen 2
M öffentliche nicht-statische Funktion fremder Klasse ausführn Java Basics - Anfänger-Themen 16
C args[] als statische Variablen speicher oder wie? Java Basics - Anfänger-Themen 12
P nicht statische methode instantiieren Java Basics - Anfänger-Themen 7
H statische methoden und sichtbarkeit Java Basics - Anfänger-Themen 13
nadoria statische Methoden (Klassenmethoden) Java Basics - Anfänger-Themen 3
K statische variablen und methode Java Basics - Anfänger-Themen 3
H Was ist nocheinmal eine statische Klasse? Java Basics - Anfänger-Themen 6
G Statische Methoden? Java Basics - Anfänger-Themen 2
kb statische methoden und throws exception Java Basics - Anfänger-Themen 2
H statische, dynamischer Typ von Variablen Java Basics - Anfänger-Themen 1
M Konstruktor eine statische Methode? Java Basics - Anfänger-Themen 9
H statische,dynamische Bindung Java Basics - Anfänger-Themen 4
N Unterschied statische Attribute u. Methoden <-> objekt Java Basics - Anfänger-Themen 4
O nicht-statische Inhalte auf statische Inhalte verweisen Java Basics - Anfänger-Themen 19
M wann statische klassen? Java Basics - Anfänger-Themen 14
U statische Variablen Java Basics - Anfänger-Themen 12
F Statische Methode - Nicht Statische Methode Java Basics - Anfänger-Themen 10
S Statische Felder - statische Methoden Java Basics - Anfänger-Themen 2
D Statische und Nicht-Statische Methoden Java Basics - Anfänger-Themen 7
K Statische Methoden!? Java Basics - Anfänger-Themen 8
B Synchronisation eines kleinen Museums Java Basics - Anfänger-Themen 47
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
M Umgang mit Thread/ Synchronisation/ Deadlock-Vermeidung Java Basics - Anfänger-Themen 5
P Thread Synchronisation Java Basics - Anfänger-Themen 9
T Thread Synchronisation Java Basics - Anfänger-Themen 3
Dit_ Thread Synchronisation | Übung Java Basics - Anfänger-Themen 5
M lock notify synchronisation Java Basics - Anfänger-Themen 8
A Ausgabe immer anders, synchronisation? Java Basics - Anfänger-Themen 2
hdi Synchronisation zwischen JList und ListModel Java Basics - Anfänger-Themen 6
1 JList Problem : Synchronisation mit Vector klappt nicht :( Java Basics - Anfänger-Themen 6
H Synchronisation von Threads Java Basics - Anfänger-Themen 12
Kr0e Synchronisation Java Basics - Anfänger-Themen 7
G Synchronisation Java Basics - Anfänger-Themen 8
A Thread Synchronisation Java Basics - Anfänger-Themen 10
M thread synchronisation Java Basics - Anfänger-Themen 6
L Problem bei Synchronisation von Threads Java Basics - Anfänger-Themen 3
S Sockets und Synchronisation Java Basics - Anfänger-Themen 7
U Synchronisation, Thread Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben