Java >> Java tutorial >  >> Tag >> synchronized

Synkroniseret blok virker ikke

4. Den synkroniserede kodeblok vil opnå en lås på StringBuffer-objektet fra trin 3.

Nå, det gør du ikke, vel?

synchronized(this) {

Du får en lås på forekomsten af ​​MySyncBlockTest hvorpå den run() metode bliver kaldt. Det... kommer ikke til at gøre noget. Der er ingen strid om den ressource; hver Thread har sin egen forekomst af MySyncBlockTest .


Du bør låse StringBuffer-objektet

 synchronized(sb) {
            for (int i=0; i<10; i++) {
                System.out.print(sb);
            }

Jeg var også forvirret. Svaret fra Brian er korrekt

synchronized (this){

er for at få låsen på en instans. Det ville være nyttigt, når der er en enkelt forekomst af en klasse og flere tråde, der får adgang til den.

Jeg skrev følgende program for at demonstrere dette:

package com.threads.chapter9;

public class TestSunchronizedBlocksUsingRunnable implements Runnable {
StringBuffer s;

@Override
public void run() {
    synchronized (this) {
        for (int i = 1; i <= 100; i++) {
            System.out.println(i);
        }
        char c = s.charAt(0);
        c++;
        s.setCharAt(0, c);
    }
}

TestSunchronizedBlocksUsingRunnable(StringBuffer s) {
    this.s = s;
}

public static void main(String[] args) {
    StringBuffer s = new StringBuffer("A");
    TestSunchronizedBlocksUsingRunnable instance1 = new TestSunchronizedBlocksUsingRunnable(s);
    Thread thread1 = new Thread(instance1);
    Thread thread2 = new Thread(instance1);
    Thread thread3 = new Thread(instance1);
    thread1.start();
    thread2.start();
    thread3.start();
}

}

Ovenstående kode vil vise det samme output, men scenariet er helt anderledes. Så hvad du bruger i synkroniseret blok er virkelig afgørende.


Java tag