2017-10-08 4 views
0

Ich habe eine Frühlingsdienstklasse:Wie macht man eine primitive Instanzvariable in Spring @ Service threadsicher?

@Service 
public class MyService { 
    private boolean flag = false; 

    public void method1() { 
    if(!flag) 
    // do something 
    flag = true; 
    } 

    public void method2() { 
    if(!flag) 
    // do something 
    flag = true; 
    } 
} 

Es ist offensichtlich, dass die flag nicht Thread-sicher ist. Welche Optionen muss ich threadsicher machen, ohne den Umfang der Serviceklasse zu ändern? Kann es volatil machen, den Zweck zu lösen? Ich hatte nach der Lösung gesucht, bevor ich hier poste, konnte aber keine finden.

Antwort

1

Versuchen Sie, eine Logik nur einmal auszuführen, wenn eine Ihrer Methoden aufgerufen wird? Wenn ja, können Sie das nicht sofort mit einem @PostContruct tun? Andernfalls können Sie versuchen, synchronisiert auf das Feld zu verwenden, verlieren Sie Ihre Multi-Thread-Vorteile.

0

Es scheint, dass Ihr Ziel ist es, dass Sie nicht möchten, method1 und method2 zur gleichen Zeit auszuführen, schlägt eine Art von utilities von JDK versehen mit für Concurrency Control

Verwandte Themen