【发布时间】:2015-12-13 19:47:51
【问题描述】:
我只是想在从不同线程修改变量时如何锁定变量,例如 int。我不会那样使用它,而且我知道 Java 中的 synchronized 关键字,但我想了解它以及它一般是如何工作的。
这就是我的代码:
private int i = 0;
private int lock = 0;
public void count(int lock) {
while (true) {
if (this.lock == 0) {
this.lock = lock;
}
if (this.lock == lock) {
i ++;
this.lock = 0;
return;
}
}
}
问题:它有效吗?这个计数器线程安全吗?如果是: synchronized 关键字是否有类似的工作?如果没有:为什么不呢?
编辑:我忘了说每个线程调用 count 方法时使用不同的锁值。
【问题讨论】:
-
AtomicInteger是你的朋友。这看起来根本不是一个好主意......(一方面,不清楚您期望该方法的lock参数是什么......) -
我刚刚编辑了这个问题。每个线程使用不同的锁参数
-
由于很多原因它不会工作......
-
嗯,那里基本上没有内存屏障,所以看起来一点也不安全。两个线程完全有可能各自看到他们刚刚写入的
lock值,然后不安全地更新i。从根本上说,除非您是成熟的 Java 内存模型专家(我当然不是),否则尝试提出您自己的像这样的锁定原语是一个非常糟糕的主意。 AtomicInteger 确实是要走的路...或使用单独的Object进行同步。 -
@JonSkeet 这就是我检查两次的原因。
标签: java thread-safety locking counter synchronized