java

位置:IT落伍者 >> java >> 浏览文章

Java中的同步——示例程序


发布日期:2021年04月09日
 
Java中的同步——示例程序

前面说到了Java中的同步问题下面通过一个小小的实例程序来演示Java中的同步方法其中对前文提到的Counter类做了稍微的修改

public class Counter {

private int c = ;

public void increment() {

Systemoutprintln(before increment c = + c);

c++;

try {

Threadsleep();

} catch (InterruptedException e) {

eprintStackTrace();

}

Systemoutprintln(after increment c = + c);

}

public void decrement() {

Systemoutprintln(before decrement c = + c);

c;

try {

Threadsleep();

} catch (InterruptedException e) {

eprintStackTrace();

}

Systemoutprintln(after decrement c = + c);

}

public int value() {

return c;

}

}

在上面的Counter类的实现中分别对increment和decrement方法中增加了sleep()的调用这样做的目的是为了放大两个线程对同一对象的方法调用时的交错效果

下面是两个线程在ThreadA中调用了次increment()方法在ThreadB中调用了次decrement()方法

Thread

public class ThreadA implements Runnable {

private Counter c;

public ThreadA(Counter c) {

thisc = c;

}

@Override

public void run() {

for (int i = ; i < ; i++) {

thiscincrement();

}

}

}

ThreadB

public class ThreadB implements Runnable {

private Counter c;

public ThreadB(Counter c) {

thisc = c;

}

@Override

public void run() {

for (int i = ; i < ; i++) {

thiscdecrement();

}

}

}

主程序如下其中生成了两个线程threadA和ThreadB他们共享Counter c

public class Main {

public static void main(String[] args) {

Counter c = new Counter();

ThreadA a = new ThreadA(c);

ThreadB b = new ThreadB(c);

Thread threadA = new Thread(a);

Thread threadB = new Thread(b);

threadAstart();

threadBstart();

}

}

执行上面的代码可能的结果如下

before increment c =

before decrement c =

after increment c =

before increment c =

after decrement c =

before decrement c =

after increment c =

before increment c =

after decrement c =

before decrement c =

after increment c =

before increment c =

after decrement c =

before decrement c =

after increment c =

before increment c =

after decrement c =

before decrement c =

after increment c =

before increment c =

after decrement c =

before decrement c =

after increment c =

before increment c =

after increment c =

before increment c =

after decrement c =

before decrement c =

after decrement c =

before decrement c =

after increment c =

before increment c =

after increment c =

before increment c =

after decrement c =

before decrement c =

after increment c =

after decrement c =

before decrement c =

after decrement c =

从上面的输出结果中我们不难看出出现了严重的交错现象! 在increment或者是decrement方法中输出before和after本应该是成对连续出现的但输出结果却不是如此

将上面代码的increment()和decrement()方法用synchronized 修饰后重新运行该程序输出结果如下

before increment c =

after increment c =

before increment c =

after increment c =

before decrement c =

after decrement c =

before increment c =

after increment c =

before decrement c =

after decrement c =

before decrement c =

after decrement c =

before decrement c =

after decrement c =

before decrement c =

after decrement c =

before increment c =

after increment c =

before decrement c =

after decrement c =

before decrement c =

after decrement c =

before decrement c =

after decrement c =

before decrement c =

after decrement c =

before increment c =

after increment c =

before decrement c =

after decrement c =

before increment c =

after increment c =

before increment c =

after increment c =

before increment c =

after increment c =

before increment c =

after increment c =

before increment c =

after increment c =

这样输出结果和没有增加synchronized修饰符时的大不相同单独一次的increment和decrement方法并没有出现交错的现象只是连续次的increment()和decrement ()有交错(这个不是synchronized能解决的问题)

至少我们从上面的实例程序中可以看到synchronized方法的作用了

另外我们还可以使用同步语句(也就是使用Counter对象的同步锁)来代替上面的同步方法其效果是一样的有兴趣的网友可以自己尝试一下

               

上一篇:选择Java接口还是抽象类

下一篇:编写可在线收发E-mail的Java Applet