前面说到了Java中的同步问题。下面通过一个小小的实例程序来演示Java中的同步方法。其中对前文提到的Counter类做了稍微的修改。
public class Counter { private int c = 0;
public void increment() { System.out.println("before increment, c = " + c); c++; try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("after increment, c = " + c); }
public void decrement() { System.out.println("before decrement, c = " + c); c--; try { Thread.sleep(5); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("after decrement, c = " + c); }
public int value() { return c; }
} |
在上面的Counter类的实现中,分别对increment和decrement方法中增加了sleep(5)的调用,这样做的目的是为了放大两个线程对同一对象的方法调用时的交错效果。
下面是两个线程。在ThreadA中调用了10次increment()方法;在ThreadB中调用了10次decrement()方法。
Thread:
public class ThreadA implements Runnable { private Counter c;
public ThreadA(Counter c) { this.c = c;
}
@Override public void run() {
for (int i = 0; i < 10; i++) { this.c.increment(); } }
} |
ThreadB:
public class ThreadB implements Runnable {
private Counter c;
public ThreadB(Counter c) { this.c = c; }
@Override public void run() { for (int i = 0; i < 10; i++) { this.c.decrement(); } }
}
|