线程同步的目的是确保当多个线程要访问单个资源时,在任何给定时间只有一个线程可以访问它。
您可以在方法级别(同步方法)或块级别(同步块)管理程序的同步。要使代码块同步,可以使用synchronized关键字。
以下示例显示了如何使用synchronized关键字。
增量器
package org.nhooo.example.lang.thread;
public class Incrementor {
private int count;
// 同步方法示例。
public synchronized void increment(int value) {
count += value;
System.out.println(Thread.currentThread().getName() +
": inc >>> " + count);
}
public void decrement(int value) {
// 使用当前对象实例的同步块示例
// 作为监视对象。
synchronized (this) {
count -= value;
System.out.println(Thread.currentThread().getName() +
": dec >>> " + count);
}
}
}增量线程
package org.nhooo.example.lang.thread;
public class IncrementThread implements Runnable {
private 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();
}
}
}
}增量演示
package org.nhooo.example.lang.thread;
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();
}
}这是程序打印的示例结果:
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