同步线程行为

Synchronized threads behaviour

我有一个 Cell class 表示单个值和 swapThread class 其 运行方法只是在Cell.

中调用方法swapValue()
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();
}

class 单元格:

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());
}

}

classswapThread:

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() 完成,但是有没有办法通过更改同步方法来避免这种情况。

您可以通过将此方法设为静态和同步来实现 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);
}