线程同步的目的是确保当多个线程要访问单个资源时,在任何给定时间只有一个线程可以访问它。
您可以在方法级别(同步方法)或块级别(同步块)管理程序的同步。要使代码块同步,可以使用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