Synchronization
Synchronization is the capabilility of control the access of multiple threads to any shared resource.
Synchronization is better in case we want only one thread can access the shared resource at a time.
Why use Synchronization?
The synchronization is mainly used to
- To prevent thread interference.
- To prevent consistency problem.
Types of Synchronization
There are two types of synchronization
- Process Synchronization
- Thread Synchronization
Here, we will discuss only thread synchronization.
|
Thread Synchronization
There are two types of thread synchronization mutual exclusive and inter-thread communication.
- Mutual Exclusive
- Synchronized method.
- Synchronized block.
- static synchronization.
- Cooperation (Inter-thread communication)
Mutual Exclusive
Mutual Exclusive helps keep threads from interfering with one another
while sharing data. This can be done by three ways in java:
- by synchronized method
- by synchronized block
- by static synchronization
Understanding the concept of Lock
Synchronization is built around an internal entity known
as the lock or monitor.Every object has an lock associated with it. By
convention, a thread that needs consistent access to an object's fields
has to acquire the object's lock before accessing them, and then release
the lock when it's done with them.
|
From Java 5 the package java.util.concurrent.locks contains several lock implementations. |
Understanding the problem without Synchronization
In this example, there is no synchronization, so output is inconsistent. Let's see the example:
- Class Table{
-
- void printTable(int n){
- for(int i=1;i<=5;i++){
- System.out.println(n*i);
- try{
- Thread.sleep(400);
- }catch(Exception e){System.out.println(e);}
- }
-
- }
- }
-
- class MyThread1 extends Thread{
- Table t;
- MyThread1(Table t){
- this.t=t;
- }
- public void run(){
- t.printTable(5);
- }
-
- }
- class MyThread2 extends Thread{
- Table t;
- MyThread2(Table t){
- this.t=t;
- }
- public void run(){
- t.printTable(100);
- }
- }
-
- class Use{
- public static void main(String args[]){
- Table obj = new Table();
- MyThread1 t1=new MyThread1(obj);
- MyThread2 t2=new MyThread2(obj);
- t1.start();
- t2.start();
- }
- }
Output: 5
100
10
200
15
300
20
400
25
500
Solution by synchronized method
- If you declare any method as synchronized, it is known as synchronized method.
- Synchronized method is used to lock an object for any shared resource.
- When a thread invokes a synchronized method, it automatically
acquires the lock for that object and releases it when the method
returns.
|
- <b><i>
-
- Class Table{
-
- synchronized void printTable(int n){
- for(int i=1;i<=5;i++){
- System.out.println(n*i);
- try{
- Thread.sleep(400);
- }catch(Exception e){System.out.println(e);}
- }
-
- }
- }
-
- class MyThread1 extends Thread{
- Table t;
- MyThread1(Table t){
- this.t=t;
- }
- public void run(){
- t.printTable(5);
- }
-
- }
- class MyThread2 extends Thread{
- Table t;
- MyThread2(Table t){
- this.t=t;
- }
- public void run(){
- t.printTable(100);
- }
- }
-
- class Use{
- public static void main(String args[]){
- Table obj = new Table();
- MyThread1 t1=new MyThread1(obj);
- MyThread2 t2=new MyThread2(obj);
- t1.start();
- t2.start();
- }
- }
Output: 5
10
15
20
25
100
200
300
400
500
Same Example of synchronized method by using annonymous class
In this program, we have created the two threads by annonymous class, so less coding is required.
- <b><i>
-
- Class Table{
-
- synchronized void printTable(int n){
- for(int i=1;i<=5;i++){
- System.out.println(n*i);
- try{
- Thread.sleep(400);
- }catch(Exception e){System.out.println(e);}
- }
-
- }
- }
-
- class Use{
- public static void main(String args[]){
- final Table obj = new Table();
-
- MyThread1 t1=new MyThread1(){
- public void run(){
- obj.printTable(5);
- }
- };
- MyThread1 t2=new MyThread1(){
- public void run(){
- obj.printTable(100);
- }
- };
-
- t1.start();
- t2.start();
- }
- }
Output: 5
10
15
20
25
100
200
300
400
500
|
No comments:
Post a Comment