Skip to main content

Volatile and Synchronized in Java

Volatile is just another modifier like private , protected etc. It modifies the visibility of the variables and is generally more relevant in thread context.
Volatile when used on a variable ensures that every thread that is using it has the latest copy. It is important in multi threaded programming that shared variables which are frequently read and write by the threads are marked as volatile.
JVM is free to do anything with the variables and every thread can, actually does keep its own copy of variable meaning if a thread writes a new value to a variable, the other thread won't get that latest value.

private int x  = 5;

Thread 1 uses it and makes it 8, but thread 2 will have its own copy as 5 and won't see new value 8.
This can of course leads to a lot of problems and I don't think there is any need to explain that.
Primary three reasons to use volatile when needed:

1. Every thread keeps it own copy of a variable, so if you want a shared variable with publish sort of functionality i.e. that every where its latest value is used, make it volatile.
2. CPU caches : if the variable is cached it isn't necessary that that value will be updated which could lead some odd values with some threads. Hence volatile.
3. Volatile ensures that all the operations happening on that variable are atomic. For eg changing a Long value is actually two write operations than one. If that variable is not volatile it might happen that when one thread was in middle of process of modifying that variable , some other thread accessed it and got some arbitrary value since write operation was not complete.

The volatile keyword ensures that before any other thread reads that value, the write operations are completed.
Synchronized is used to achieve locks on variables which are supposed to be accessed by the different threads. Where volatile ensures every thread has the latest value, it fails to maintain the write operation or perhaps the sequence of write operations done on  a variable. This is where synchronized comes into play.
Synchronized should be implemented properly. Instead of making whole class synchronized , the actual data structures should be identified which needs to be synchronized and should be synchronized. However in some cases when that data structure is in use everywhere avoiding synchronizing every class methods is the only option.

Comments

Popular posts from this blog

Guide : Spring Boot with Apache CXF for REST services

In this series of guide, we are going to explore writing REST services with Apache CXF using Spring Boot. The project is build using maven. I assume that you already know how to use maven. Step 1 : Adding dependencies for Spring Boot By default you have to inherit the parent pom of spring boot, but that cannot be followed everytime, so I use an alternative to that. I basically add spring boot pom as dependency so that it brings all the dependencies. <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <spring.version>1.4.3.RELEASE</spring.version> <cxf.version>3.1.10</cxf.version> </properties> <dependencies> <dependency> <!-- Alternative to inheriting from parent spring pom --> <groupId>org.springframework.boot</groupI…

Enabling CXF goodies in Spring Boot

In this post we are going to add some of the CXF features to our existing app that we developed in previous post. These features are : ID LoggingJackson Provider for POJO to JSON conversionSwagger 2 documentationStep 1: Configuration class Create a RestServer class in config package as shown below
package org.blog.config;importcom.fasterxml.jackson.jaxrs.json.JacksonJsonProvider;importorg.apache.cxf.feature.LoggingFeature;importorg.apache.cxf.jaxrs.swagger.Swagger2Feature;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;/** * Created by Anand_Rajneesh on 3/23/2017. */@ConfigurationpublicclassRestServer{@Beanpublic JacksonJsonProvider jsonProvider(){returnnewJacksonJsonProvider();}@Beanpublic LoggingFeature loggingFeature(){returnnewLoggingFeature();}@Beanpublic Swagger2Feature swagger(){ Swagger2Feature swagger =new Swagger2Feature(); swagger.setBasePath("/services"); swagger.setContact("…

PL SQL Cheatsheet

PL/SQL Syntax for reference

Basic PL/SQL block
DECLARE --variable declarations go here BEGIN --program logic goes here END;
Functions - Named pl/sql blocks mainly used for computation and not for write operations. They return value to the caller as defined in function.
CREATE OR REPLACE FUNCTION myFunc( arg1_in IN VARCHAR2, arg2_in VARCHAR2) RETURN BOOLEAN AS RETURN true; END;
Procedure - Named pl/sql block used for write operations.
CREATE OR REPLACE PROCEDURE myProc( arg1_in IN VARCHAR2, arg2_in IN VARCHAR2) AS arg3 VARCHAR2(2048); arg4 BOOLEAN; BEGIN --logic END;
Variable Declarations 
arg VARCHAR2(2048) := 'myString'; arg BOOLEAN := true; arg NUMBER := 10;
IF ELSE Conditions
IF (condition) THEN --logic 1 ELSIF (condition2) THEN --logic 2 ELSE --logic3 END IF;
SWITCH Statements
With selector
arg1 NUMBER := 0; CASE arg1 WHEN 0 THEN --logic; WHEN 1 THEN --…