Question

I'm currently building a new web app, in Java EE with Apache Tomcat as a webserver. I'm using jsps and servlets in my work.

my question is:

I have a very standard business logic. None of it is synchronized, will only a single thread of my web app logic will run at any given time?

Since making all functions "synchronized" will cause a huge overhead, is there any alternative for it?

If i have a static method in my project. that makes a very simple thing, such as:

       for (int i=0;i<10000;i++ ) {
           counter++;
       }

If the method is not thread safe, what is the behavior of such method in a multi user app? Is it unexpected behavior?!

and again in a simple manner:

if i mean to build a multi user web app, should i "synchronize" everything in my project? if not all , than what should i sync?

Était-ce utile?

La solution

will only a single thread of my web app logic will run at any given time?

No, the servlet container will create only one instance of each servlet and call that servlet's doService() method from multiple threads. In Tomcat by default you can expect up to 200 threads calling your servlet at the same time.

If the servlet was single-thread, your application would be slow like hell, see SingleThreadModel - deprecated for a reason.

making all function "synchronized" will make a huge overhead, is there any alternative for it?

There is - your code should be thread safe or better - stateless. Note that if your servlet does not have any state (like mutable fields - unusual), it can be safely accessed by multiple threads. The same applies to virtually all objects.

In your sample code with a for loop - this code is thread safe if counter is a local variable. It is unsafe if it is a field. Each thread has a local copy of the local variables while all threads accessing the same object access the same fields concurrently (and need synchronization).

what should i sync?

Mutable, global, shared state. E.g. In your sample code if counter is a field and is modified from multiple threads, incrementing it must be synchronized (consider AtomicInteger).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top