同步线程行为
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);
}
我有一个 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);
}