同步线程行为

时间:2015-04-28 11:32:05

标签: java multithreading synchronization

我有 Cell class 表示单个值和 swapThread类,其run方法只调用Cell中的方法 swapValue()。 / p>

public static void main(String[] args) throws InterruptedException {

    Cell c1 = new Cell(15);
    Cell c2 = new Cell(23);

    Thread t1 = new swapThread(c1, c2);
    Thread t2 = new swapThread(c2, c1);

    t1.start();
    t2.start();
}

类Cell

class Cell {
private static int counter = 0;
private int value, id;

public Cell(int v) {
    value = v;
    id = counter++;
}

synchronized int getValue() {
    return value;
}

synchronized void setValue(int v) {
    value = v;
}

void swapValue(Cell other) {

    int t = getValue();
    System.out.println("Swapping " + t);
    int v = other.getValue();
    System.out.println("with " + v);
    setValue(v);
    other.setValue(t);

    System.out.println("Cell is now " + getValue());
    System.out.println("Cell was " + other.getValue());
}

}

类swapThread

class swapThread extends Thread {
Cell cell, othercell;

public swapThread(Cell c, Cell oc) {
    cell = c;
    othercell = oc;
}

public void run() {

    cell.swapValue(othercell);

}
}

常用输出:

Swapping 15
Swapping 23
with 23
with 15
Cell is now 23
Cell is now 15
Cell was 15
Cell was 23

我可以等待thread1在main方法中以 Thread.join()结束,但有办法通过更改同步方法来避免这种情况。

1 个答案:

答案 0 :(得分:1)

通过使此方法静态和同步,您可以实现swapValues()的串行执行:

static synchronized void swapValues(Cell c1, Cell c2) {

    int t = c1.getValue();
    System.out.println("Swapping " + t);
    int v = c2.getValue();
    System.out.println("with " + v);
    c1.setValue(v);
    c2.setValue(t);

    System.out.println("Cell is now " + c1.getValue());
    System.out.println("Cell was " + c2.getValue());
}

因此,您可以在Cell.class上同步它,使swapValues()按顺序执行。

注意,现在你需要传递2个单元格:

public void run() {
    Cell.swapValues(cell, othercell);
}