synchronized / lock

unknown

Bekanntes Mitglied
hallo

Wenn ich zwei Methoden innerhalb einer Klasse synchronisieren möchte, ist es ja kein problem. einfach den Begriff "synchronized" anwenden und dann funktionierts.
Doch wie kann ich zwei oder mehrere Methoden, welche sich in unterschiedlichen Klassen befinden, synchronisieren?

Ich dachte, es ist mit "Lock" und "unlock" möglich?
Jedoch alle Beispiele mit Lock, die ich im Google finde, sind für eine einzige Klasse gedacht. Was mich zu meiner zweiten Frage führt: was ist denn überhaupt der Unterschied zwischen synchronized und Lock?
 
Hey!

Was ich weiß einfach das Schlüsselwort synchronized benutzen. es ist egal wo die Klasse.
Synchronized sagt den Threads nur wer zuerst kommt kommt zuerst. Alle anderen warten.
Das funktioniert unabhängig von Klassen 😉.

Und ja Lock ist gut wenn du nur 2 Codezeilen synchronisieren willst. Manchmal ist es halt bisschen aufwendig alle Methoden zu synchronisieren wenn nur 2 Codezeilen nicht Threadsicher sind 😉


lg

Rene
 
Hey!

Was ich weiß einfach das Schlüsselwort synchronized benutzen. es ist egal wo die Klasse.

Hey 🙂
Ich habe es probiert und es scheint nicht der Fall zu sein. Offenbar funktioniert synchronized nur innerhalb einer Klasse.

Ich nehme an, dass es mit Lock machbar wäre. Finde allerdings kein Beispiel im Google, wie man das machen könnte.

Ein kleines Beispiel würde mir reichen.
 
Allein diese Aussage ist schon absoluter Quatsch.
Du kannst nicht zwei Methoden miteinander synchronisieren.
Du kannst nur den konkurrierenden Zugriff (i.d.R durch mehrere Threads) auf ein und dieselbe Ressource synchronisieren.

Gruß
JP

ich glaub die Aussage war einfach nicht gleichzeitig sondern einfach allgemein. wenn man 2 Methoden in der Klasse hat das man Sie synchonisieren kann.

😉


lg

Rene
 
Oh. und ja ich glaub cih weiß was du meinst ja hast recht JavaProfi 😉

und du kannst 2 Methoden nie gleichzeitig starten.
Das geht net. Du könntest maximal 1 methode aufrufen und sofort die zweite. ansonsten gehts net.
Oder was meinst du?
 
Die "Klasse" spielt hier keine Rolle, sondern die Daten(das Objekt), das verändert werden soll.
Und noch genauer geht es bei syncronized und bei lock um die Regelung des zugriffs auf dieses Object.

Dir wird sicher schon aufgefallen sein, das du nicht einfach so syncro hinschreiben kannst, sondern auch ein Object angeben solltest über welches dann halt syncronoisiert wird.😳

Gruß Vanny
 
und du kannst 2 Methoden nie gleichzeitig starten.
klar...


Java:
import java.util.Random;

public class Test implements Runnable {

    static Object semaphore = new Object();

    static Random rnd = new Random();

    public static void main(String[] args) {

        new Thread(new Test()).start();
        new Thread(new Test()).start();

    }

    public void test1() throws InterruptedException {
        // synchronized (semaphore) {
        System.out.print("test1 -> ");
        Thread.sleep(rnd.nextInt(100));
        System.out.println("<- test1");
        // }
    }

    public void test2() throws InterruptedException {
        // synchronized (semaphore) {
        System.out.print("test2 -> ");
        Thread.sleep(rnd.nextInt(100));
        System.out.println("<- test2");
        // }
    }

    @Override
    public void run() {
        while (true) {
            try {
                test1();
                test2();
                Thread.sleep(rnd.nextInt(250));
            }
            catch (InterruptedException e) {
            }
        }
    }
}

Wobei ich anmerken muss das ich kein Multitreading Profi bin. Das könnte komplett gefährlich und falsch sein was ich da mit der semaphore mache... ;-)
 

Zurück
Oben