2012-07-14 17 views

Antwort

22

Ihre Frage läuft darauf hinaus: wird ein Verfahren von mehreren Threads auf dem anruf Das gleiche Objekt ist threadsicher. Und die Antwort ist: es kommt darauf an. Wenn Ihr Objekt (sei es Servlet sein) zustandslos ist oder nur final Felder hat, ist dies völlig threadsicher. Lokale Variablen und Parameter sind lokal für den Thread (befinden sich auf dem Stapel, nicht auf dem Heap).

Auch jeder service() Anrufe erhält unterschiedliche Instanz von ServletRequest und ServletResponse. Doch hier ein Beispiel für unsichere Servlet ist:

public class UnsafeServlet implements Servlet { 

    private int counter; 

    public void init(ServletConfig config) throws ServletException { 
    } 

    public void service(ServletRequest request, ServletResponse response) 
     ++counter; 
    } 

    public void destroy() { 
    } 

} 

Da mehrere Threads counter Variable zugreifen kann, muss es irgendwie gesichert werden: entweder durch die Verwendung synchronized (volatile ist nicht genug):

synchronized(this) { 
    ++counter; 
} 

oder AtomicInteger:

private AtomicInteger counter = new AtomicInteger(); 

//... 
counter.incrementAndGet(); 

In diesem speziellen Fall AtomicInteger ist viel besser sinc e es ist gesperrt frei mit CAS-CPU-Operationen, während synchronized ist ein Mutex.

+0

@ Tomasz.können Sie hier ein kurzes Beispiel postulieren, mit dem Sie sagen können, dass Sie ein einfaches Servlet haben und mit 2 verschiedenen Browsern eine Anfrage stellen und durch einen Thread den Wert ändern. Dieses Ding möchte ich sehen ... Danke im Voraus – user1508454

+0

Toller Mann, könntest du bitte posten, wie würdest du den Counter jetzt schützen, und durch Synchronisieren wird es Auswirkungen auf die Performance haben, könntest du bitte auch ein wenig über Atomic Integer erklären – user1508454

+0

@ user1508454: siehe meine Updates –