【发布时间】:2014-11-09 21:03:28
【问题描述】:
对不起我的英语
我不使用任何字段进行锁定,因为我不应该考虑某些字段是否可以具有值 null。
我总是创建仅用于锁定线程同步的特殊字段。
例如:
public class Worker {
private static final List<Toilet> TOILETS = Arrays.asList(
new Toilet(1),
new Toilet(2),
// ...
new Toilet(NUMBER_OF_FLOORS)
);
// here it is:
private static final List<String> LOCK_TOILETS = Arrays.asList(
"LOCK TOILET #1",
"LOCK TOILET #2",
// ...
"LOCK TOILET #" + NUMBER_OF_FLOORS
);
private final int floorNumber;
public void spendWorkingHours() {
for (int i = 0; i < X; ++i) {
doWork();
snackSomething();
String lockToilet = LOCK_TOILETS.get(floorNumber);
Toilet theOnlyToiletOnTheFloor = TOILETS.get(floorNumber);
synchronized (lockToilet) {
goToToilet(theOnlyToiletOnTheFloor);
}
}
}
}
【问题讨论】:
-
你应该同步你正在使用的实际对象,在这个例子中是厕所。
-
@ChristofferHammarström 如果这个变量可以是
null怎么办? -
@Christoffer Hammarström 不,你不应该。它增加了额外的约束。想象一下程序的其他独立部分做 sme。这导致两个独立的部分会相互干扰
-
@talex “干扰”是什么意思?目标不是防止厕所物体出现竞争条件吗?这种互斥“干扰”将确保程序安全。
-
@UmNyobe 也许是的。但是想象一下,我锁在马桶上,但使用不同的对象。
标签: java string multithreading synchronization synchronized