What is Synchronization?
- The concept of avoiding multiple threads entering into a common functionality of common object simultaneously is known as thread safe or synchronization.
- we implement the concept of thread safe using synchronized keyword. The functionality of Synchronized keyword is to avoid multiple threads entering into a common functionality of common functionality.
Why do we need Synchronization?
- The "Synchronized" keywords prevents concurrent access to a block of code or object by multiple Threads.
- Synchronized keyword in Java provides locking, which ensures mutual exclusive access of shared resource and prevent data race.
- To prevent consistency problem and thread interference .
Producer consumer problem:
Common class:
package com.instanceofjavaforus;public class Common {
int x;
boolean flag=true;
//if flag is true producer thread has to produce
// if flag is false consumer thread has to produce
synchronized public void produce(int i){
if(flag){
x=i;
System.out.println("producer thread has produced "+i);
flag=false;
notify();
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
synchronized public int consume(){
if(flag){
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
flag=true;
notify();
return x;
}
}
package com.instanceofjavaforus;
public class ProducerThread extends Thread {
Common c;
ProducerThread(Common c){
this.c=c;
}
public void run(){
int i=0;
while(true){
i++;
c.produce(i);
try {
Thread.sleep(600);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
ConsumerThread:
package com.instanceofjavaforus;public class ConsumerThread extends Thread {
Common c;
ConsumerThread(Common c){
this.c=c;
}
public void run(){
while(true){
int x=c.consume();
System.out.println("Consumer consumes"+x);
try {
Thread.sleep(600);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
ProducerConsumerTest:
package com.instanceofjavaforus;public class ProducerConsumerTest {
public static void main(String args[]){
Common c= new Common();
ProducerThread pt=new ProducerThread(c);
ConsumerThread ct= new ConsumerThread(c);
pt.start();
ct.start();
}
}
Output:
producer thread has produced 1
Consumer consumed 1
producer thread has produced 2
Consumer consumed 2
producer thread has produced 3
Consumer consumed 3
producer thread has produced 4
Consumer consumed 4
producer thread has produced 5
Consumer consumed 5
producer thread has produced 6
Consumer consumed 6
No comments