Last Updated : 03 Apr, 2024
Synchronization:
Synchronization is a modifier that is used for the method and blocks only. With the help of a synchronized modifier, we can restrict a shared resource to be accessed only by one thread. When two or more threads need access to shared resources, there is some loss of data i.e. data inconsistency. The process by which we can achieve data consistency between multiple threads is called Synchronization.
Why do you need Synchronization?
Let us assume if you have two threads that are reading and writing to the same 'resource'. Suppose there is a variable named geek, and you want that at one time only one thread should access the variable(atomic way). But Without the synchronized keyword, your thread 1 may not see the changes thread 2 made to geek, or worse, it may only be half changed that cause the data inconsistency problem. This would not be what you logically expect. The tool needed to prevent these errors is synchronization.
In synchronization, there are two types of locks on threads:
// Java program to illustrate
// Object lock concept
class Geek implements Runnable {
public void run() { Lock(); }
public void Lock()
{
System.out.println(
Thread.currentThread().getName());
synchronized (this)
{
System.out.println(
"in block "
+ Thread.currentThread().getName());
System.out.println(
"in block "
+ Thread.currentThread().getName()
+ " end");
}
}
public static void main(String[] args)
{
Geek g = new Geek();
Thread t1 = new Thread(g);
Thread t2 = new Thread(g);
Geek g1 = new Geek();
Thread t3 = new Thread(g1);
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}
t1 t3 t2 in block t3 in block t1 in block t3 end in block t1 end in block t2 in block t2 end
// Java program to illustrate class level lock
class Geek implements Runnable {
public void run() { Lock(); }
public void Lock()
{
System.out.println(
Thread.currentThread().getName());
synchronized (Geek.class)
{
System.out.println(
"in block "
+ Thread.currentThread().getName());
System.out.println(
"in block "
+ Thread.currentThread().getName()
+ " end");
}
}
public static void main(String[] args)
{
Geek g1 = new Geek();
Thread t1 = new Thread(g1);
Thread t2 = new Thread(g1);
Geek g2 = new Geek();
Thread t3 = new Thread(g2);
t1.setName("t1");
t2.setName("t2");
t3.setName("t3");
t1.start();
t2.start();
t3.start();
}
}
t1 t2 t3 in block t1 in block t1 end in block t3 in block t3 end in block t2 in block t2 end
Reference: https://docs.oracle.com/javase/tutorial/essential/concurrency/sync.html
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4