Singleton - Spring Bean why not thread safe - java

I understand Object Creation and Thread safety are two different things.
Singleton is a way of constructing an object, some design pattern we follow to construct the object.
Spring Bean - Using Singleton scope, we guarantee that only 1 instance will be there, but still Spring bean is not thread safe.. why..??

Cannot be thread safe, precisely because just one instance is created, so every request(thread) will use the very same instance, so concurrency issues may happens.
If for example your scope is prototype, Spring wont use singleton and then it will create an instance per getClass invokation.
Same thing for request or session, instance will be created by request or per user session.
As a rule, use the prototype scope for all state-full beans and the singleton scope for stateless beans.
you can read in the documentation how it´s working
http://www.tutorialspoint.com/spring/spring_bean_scopes.htm

Related

Actual business scenrio where we use Prototype scope in spring?

I was readign about differnt scopes for beans in Spring.
Everytime I have created bean in xml , I have never use scope property, which means It was SingleTon."
For prototype I read that " Prototype scope is preferred for the stateful beans"
What is meant by stateful beans?
Can someone give me realtime example, where we have prototype scope?
Since singleton is one instance for the whole application, and this object (I'm speaking about the patter, not even spring yet) if had some state for the example name. This field called name should be fine while just one thread calls the object. BUT singleton is one object for application as I said before.
A typical example in spring
#Component
MyComponent{
private String name;
public void editName(String newName)
{
name=newName
}
}
ASAP more than one thread call this bean, you will have race conditions (you should read about it ). That's why a singleton must not have state but could have other dependencies (dependency injection).
If you use prototype scope, spring will create one object per use, so in the example name will not be shared and there is any race condition, that's fine!!

Spring bean singleton and singleton pattern [duplicate]

This question already has answers here:
Singleton design pattern vs Singleton beans in Spring container
(11 answers)
Closed 5 years ago.
I know Spring can create singleton beans. Does it mean that we needn't use 'Singleton Pattern' to create a java bean by myself? And what's the difference between the spring singleton and singleton pattern?
Spring singleton is unique ApplicationContext (per Spring container) instance. Meaning if you create a new ApplicationContext then you would get a new instance of the bean even if it's singleton.
However original Java singleton means one instance per Classloader. Meaning that singleton instance remains same for a particular classloader. In most cases that's fine, however suppose if you need a true singleton, single instance per JVM then there's some extra work to do. Look at this example https://stackoverflow.com/a/47445573/5343269
Answer to your question is if you are instantiating a single spring container in your application then spring singleton bean can be treated as a singleton, however that's true only for Spring components. Meaning this instance can not be accessed by any class that's not a Spring bean.
To be safe, don't rely on the spring singleton and create your own singleton class.

Spring bean singleton vs singleton pattern [duplicate]

This question already has answers here:
Singleton design pattern vs Singleton beans in Spring container
(11 answers)
Closed 3 years ago.
Is it common that in Java programming using Spring bean to control singleton instance instead of making a class with the singleton pattern?
It depends. If you need an utility class, which has no dependencies and that just provide a bunch of commons methods, I think it is quick and straightforward to build your own singleton.
But if you want to build a business class which needs to be injected with other dependencies, and probably, you want to define interfaces to avoid coupling between classes, I think Spring (or other DI frameworks) are better (easier) than build your own singleton.
These are the differences :
JVM handles the lifecycle of Singleton pattern classś object where Spring context handles life cycle of Spring singleton bean.
Singleton pattern classś object will be single for whole JVM where if you have multiple SpringContext in same JVM you can have multiple objects of it.
It depends on how loosely you interpret the Singleton pattern.
In my interpretation, Singleton implies that there is exactly one instance per given context. The context is usually the JVM (the ClassLoader, actually), as that is the easiest to implement with plain Java code, but nothing stops me from mapping the pattern to different contexts, one of them being Spring's ApplicationContext.
According to this definition, one could argue that the "request" and "session" scopes also hold singleton objects, just with a narrower scope.
See also this previous answer of mine, where I go into more detail.
Simply, when you use spring bean singleton, you will have one instance per spring container.
However, when you implement the singleton pattern by yourself (java based design pattern in our case), you will have one instance per java class loader.

What is mean by STATE of a bean?

It is generally said that choose only those beans as singleton that don’t have state. I am new to Spring and reading about bean scope in Spring.
My first query was what this STATE actually mean with respect to Bean?
Secondly, Why it is recommended to use singleton scope with only stateless bean? Is there some thread safe related limitations or Is there any other reason?
Any member attributes of class is referred to as its state.
Classes with no mutable state are best suitable for becoming a Spring (singleton) beans. Mutable state refers to those member attributes to which new values can be assigned after the object has been constructed.
Beans like DAOs which have member attributes such as JpaRespository can be considered to have fairly immutable state, as no one assigns new values to JpaRespository attribute once DAO object has been initialized.
Only beans which have no state (no member attributes) or have immutable state (member variables whose values are not updated once they have been assigned a value) are the ideal candidates for becoming Spring bean. This is because most Spring beans are configured as Singleton beans, and are used by multiple threads in the container. Imagine if you had mutable state and multiple threads were trying to update state of singleton bean, you will never have predictable result.
If your bean is not Singleton, but instead it is a Prototype bean, then, that bean can have state as such beans are created and destroyed as per need.
An object (and a bean is an object) has a state if the calls to methods do not only depend on the parameter given to the method call but also to the previous calls.
In principle if you have any instance variables you have likely a state. The only exception to this is that singletons stored in instance (not static) variables (which is quite usual in spring programming) don't count to the state.
When using a multithreaded environment a state in a singleton can have side effects. E.g. one thread sets the state (e.g. a connection to open) and another thread does not expect this state. Then one thread could fail.
In which state of object you want to run your program.When you design and write your class you do not know whether client use it as singleton OR prototype. The container configures object .So,it might be singleton OR prototype .For example TransactionAwareDataSourceProxy
class of spring framework is written to run in either protoype Or singleton.The class is written in such a way that it is safe from multithrading access .As the state that is shared by all threads is made common via DI container with some setter method.So,the configuration as singleton is made at startup via container and its common value is used by all threads Or single thread.The setting of instance variable is made only once with some setter method.
For example in class TransactionAwareDataSourceProxy there is reobtainTransactionalConnections as instance variable.
public TransactionAwareDataSourceProxy()
{
reobtainTransactionalConnections = false;
}
public TransactionAwareDataSourceProxy(DataSource targetDataSource)
{
super(targetDataSource);
reobtainTransactionalConnections = false;
}
public void setReobtainTransactionalConnections(boolean reobtainTransactionalConnections)
{
this.reobtainTransactionalConnections = reobtainTransactionalConnections;
}
These are the places in code where reobtainTransactionalConnections is iniatialized .If you decided to make this class singleton via DI container you set in once either with constructor injection OR setter injection.So,if we make setter injection then setReobtainTransactionalConnections will be either true Or false and remains same throughout the object life time.I think thats the advantages of configuring object with container ,the object state control can be easily made

Spring Singleton Vs Singleton Design pattern - Class Loader

Singleton Pattern maintains the instance at Spring Container Level, while the Singleton Design Pattern maintains it at Class Loader Level.
Is any other difference?
Next, I still think there the above reason in not a valid reason. It is just the matter of fact that one Application Context/Container is loaded in one Class Loader only. Thus technically there is no difference.
Is that correct or I am missing something?
Ref: Singleton design pattern vs Singleton beans in Spring container
Well, the real difference is not around class loading, but it's about the design principle. Singleton pattern has it's own limitations. It exposes an object globally as well as it's difficult to test. But, singleton through DI framework like Spring or Guice is free from those problems.
This SO thread may help you to understand. As well as Google-singleton-detector and Misko Hevery's blog are also interesting read.
Using a "real" singleton is more limiting in the sense that you are then bound to be able to create only a single instance of that class (within a classloader).
If you use Spring singleton-scoped beans, you can create as many "singleton" instances of that class you like (as long as the bean class is not a real singleton).
Hence they are not technically the same thing.
This is mostly the name that these two have in common. Singleton pattern ensures a class has only one instance, while Spring's singleton bean scope just instructs container to use the single instance of a bean during dependency injection, the bean can be any class with no restrictions.
A spring singleton ensures that only one instance of the object is created as long as the object is created using spring framework. On the contrary implementing the singleton pattern ensures that only one instance of the object is present.
I have seen code where objects were defines as singleton in spring configuration. The singleton object was some times created using spring DI and other times using new operator.
Hence caution is required to ensure that such kinds of abuses are not made and single instance of singletons be maintained.
Singleton pattern is described at per class loader level.
Singleton bean scope is per spring container.
http://www.javabench.in/2012/04/difference-between-singleton-design.html

Categories