Je suis un peu nouveau sur les fils. Comment puis-je prouver, en écrivant du code dans une classe séparée, que la classe MyClass n'est pas thread-safe ? J'ai cherché mais je ne trouve pas vraiment d'exemple pour m'aider.

public class MyClass {
  private static int value = 0;
  
  public static void set(int setVal) {
    value = setVal;
  }

  public static int get() {
    return value;
  }  

  public static void decrement() {
    int temp = value;
    value = --temp;
  }
}
3
kai-san 4 nov. 2020 à 00:00

1 réponse

Meilleure réponse
public static void main(String[] args) {
    int nt = 10;
    int c = 20000;

    MyClass.set(c);

    Thread[] threads = new Thread[nt];

    for (int t = 0; t < nt; t++) {
        Thread thread = new Thread(() -> {
            for (int i = 0; i < c; i += nt) {
                MyClass.decrement();
            }
        });
        thread.start();
        threads[t] = thread;
    }

    try {
        for (Thread thread : threads) {
            thread.join();
        }
    } catch (Throwable tr) {
        tr.printStackTrace();
    }

    System.out.println(MyClass.get());
}

Essaye ça. Si vous ajoutez synchronisé à la méthode de décrémentation de MyClass, il affichera 0 (thread safe), mais si vous ne synchronisez pas la décrémentation, il affichera un nombre erroné.

Cela prouve que MyClass (sa méthode de décrémentation) n'est pas une preuve de thread, car si c'était le cas, elle afficherait 0.

De plus, si vous ne pouvez pas utiliser les lambdas, remplacez la première boucle for par ce qui suit :

for (int t = 0; t < nt; t++) {
    Thread thread = new Thread(() -> {
        for (int i = 0; i < c; i += nt) {
            MyClass.decrement();
        }
    });
    thread.start();
    threads[t] = thread;
}

J'espère que je pourrais aider!

2
IntoVoid 3 nov. 2020 à 23:06