The objective of thread synchronization is to ensure that when several threads want access to a single resource, only one thread can access it at any given time.
You can manage synchronization of your program at method level (synchronized method) or at block level (synchronized block). To make a block of code synchronized you can use the synchronized
keyword.
The example below show how you can use the synchronized
keyword.
- Incrementor class
package org.kodejava.lang;
public class Incrementor {
private int count;
// A synchronized method example.
public synchronized void increment(int value) {
count += value;
System.out.println(Thread.currentThread().getName() +
": inc >>> " + count);
}
public void decrement(int value) {
// A synchronized block example the use the current object instance
// as the monitor object.
synchronized (this) {
count -= value;
System.out.println(Thread.currentThread().getName() +
": dec >>> " + count);
}
}
}
- IncrementThread class
package org.kodejava.lang;
public class IncrementThread implements Runnable {
private final Incrementor incrementor;
public IncrementThread(Incrementor incrementor) {
this.incrementor = incrementor;
}
public void run() {
for (int i = 1; i <= 5; i++) {
incrementor.increment(i * 10);
incrementor.decrement(i * 2);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- IncrementorDemo class
package org.kodejava.lang;
public class IncrementorDemo {
public static void main(String[] args) {
Incrementor incrementor = new Incrementor();
Thread t1 = new Thread(new IncrementThread(incrementor), "T1");
Thread t2 = new Thread(new IncrementThread(incrementor), "T2");
t1.start();
t2.start();
}
}
Here an example result printed by the program:
T1: inc >>> 10
T1: dec >>> 8
T2: inc >>> 18
T2: dec >>> 16
T1: inc >>> 36
T1: dec >>> 32
T2: inc >>> 52
T2: dec >>> 48
T1: inc >>> 78
T1: dec >>> 72
T2: inc >>> 102
T2: dec >>> 96
T1: inc >>> 136
T1: dec >>> 128
T2: inc >>> 168
T2: dec >>> 160
T1: inc >>> 210
T1: dec >>> 200
T2: inc >>> 250
T2: dec >>> 240
Latest posts by Wayan (see all)
- How do I get number of each day for a certain month in Java? - September 8, 2024
- How do I get operating system process information using ProcessHandle? - July 22, 2024
- How do I sum a BigDecimal property of a list of objects using Java Stream API? - July 22, 2024