当您实现一个有一个或多个对象被数个线程共享的并发应用, 您必须使用一同步机制(如锁或synchronized关键字)保护对它们的属性的访问以避免数据不一致的错误。
这些机制有以下问题:
为了在此情况提供更好的性能,开发了 比较并交换 操作。此操作通过以下3步改变变量值:
用此机制,不需使用任何同步机制,这样避免了死锁,同时获得了更好的性能。
Java在 原子变量 中实现了此机制。这些变量提供的 compareAdnSet() 方法是 比较并交换 操作的实现和其他方法的基础。
Java 也引入了 原子数组 ,为整型和长整型数组提供原子操作。
本节的示例代码在 com.elanzone.books.noteeg.chpt6.sect09 package中
Runnable 实现类 : Incrementer
private AtomicIntegerArray vector; public Incrementer(AtomicIntegerArray vector) { this.vector = vector; }
@Override public void run() { for (int i = 0; i < vector.length(); i++) { vector.getAndIncrement(i); } }
Runnable 实现类 : Decrementer
private AtomicIntegerArray vector; public Decrementer(AtomicIntegerArray vector) { this.vector = vector; }
@Override public void run() { for (int i = 0; i < vector.length(); i++) { vector.getAndDecrement(i); } }
控制类 : Main
final int THREADS = 100; AtomicIntegerArray vector = new AtomicIntegerArray(1000); Incrementer incrementer = new Incrementer(vector); Decrementer decrementer = new Decrementer(vector); Thread threadIncrementer[] = new Thread[THREADS]; Thread threadDecrementer[] = new Thread[THREADS]; for (int i = 0; i < THREADS; i++) { threadIncrementer[i] = new Thread(incrementer); threadDecrementer[i] = new Thread(decrementer); } for (int i = 0; i < THREADS; i++) { threadIncrementer[i].start(); threadDecrementer[i].start(); } for (int i = 0; i < THREADS; i++) { try { threadIncrementer[i].join(); threadDecrementer[i].join(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < vector.length(); i++) { if (vector.get(i) != 0) { System.out.println("Vector[" + i + "] : " + vector.get(i)); } } System.out.println("Main: End of the example");