I have multiple threads running which access singleton object and call its method and pass objects in it. In the method I do some calculations only on recieved object. I have he
I think you have to distinguish between what you've already stored in memory and code execution.
In a Singleton Object you have:
Now coming to your question: if you share your singleton object among multiple threads and access it concurrently, every single thread will execute Singleton object's portion of code, wrapped in its own execution.
Also if you write a Thread.currentThread().getId();
which basically returns the thread ID you're executing into singleton's methods, you will obtain different ids, because different threads are executing their own method stack. Being stateless means you've no fields into the singleton to be shared amongst them!
A word on Stateless and Stateful
Stateless means that the bean hasn't got any modifiable field to share. That means you have only methods or/and static stuff in your object, so you can use them anywhere and will always return you same result. You don't have to worry about synchronizing the access to the field.
That's a basic example about stateless, let's suppose you have a class that only performs the sum operation:
public class StatelessClass{
public int sum(int a, int b){
return a+b;
}
}
In the same way, you can declare it as a abstract class (no instantiable itself) and make its methods static, which means you don't need any instance of it to call its methods:
public abstract class StatelessClass{
/**
* I only sum objects
*/
public static int sum(int a, int b){
return a+b;
}
}
Then you can use it as StatelessClass.sum(1,1);
, this actually would be very similar to have a Singleton object itself, with the difference that in the Singleton you have a unique instance shared in the application.
In the same way, having a field which is injected and provides access to a service neither is considered to alter the state of the object:
public class StatelessServiceClass{
private Service service;
public int sum(int a, int b){
return service.sum(a,b);
}
public void setService(Service serv){
this.service=serv;
}
}
However, having a field which is modifiable makes the Object stateful:
public class StatefulClass{
//This fields make the object STATEFUL
private int totalSum = 0;
public int sum(int a, int b){
int sum = a + b;
totalSum = totalSum + sum;
if (totalSum > 100)
System.out.println("This thread "+Thread.currentThread().getId()+
+" got it!");
return sum;
}
}
As sum
can be accessed by multiple threads at the same time, you should guarantee that totalSum
is accessed in a synchronized way. The printed sentence is not guaranteed to be true unless you do it.
All of this is also properly explained in this answer's Threadsafety piece by @BalusC.