【发布时间】:2015-05-11 07:18:45
【问题描述】:
这与我之前的问题类似,因为我仍然不清楚同步关键字。
这次我会很短。
private int count = 0;
synchronized void increment() {
count++;
}
count 是一个实例变量,在 2 个线程之间共享。
如果线程 t1 和 t2 尝试增加计数并且操作系统给了 t1 机会首先增加计数:-
t1 获取锁并以原子方式递增 count,递增 count 所需的时间为 1 分钟(考虑),包括获取锁所需的时间。
但是线程t2呢,它必须等到锁被释放。 释放锁后,t2 现在自动增加计数,这也需要 1 分钟。
所以同步提供了正确性,但也需要时间来执行。线程意味着在更短的时间内完成工作,那么为什么要在线程中使用同步有什么用呢。
我的理解正确吗?
【问题讨论】:
-
您已修复原子性但不可见性
count应为volatile -
这就像你可以使用更多的人在更短的时间内完成一些工作,但是在给定的时间只有一个人可以完成的任务很少(读取关键部分的同步修复)。
-
@NitinDandriyal 您可能正在考虑其他语言。根据 JVM 规范,一个线程中与另一个线程具有发生前发生关系的操作在另一个线程中是可见的。并且在同一监视器上进行同步会创建这种先发生的关系。也可以访问相同的 volatile 变量。
-
@ErwinBolwidt 感谢您的纠正,确实,在特定对象监视器上进入和退出
synchronized时,进入/退出线程还会将所有变量的副本与主内存同步。我在建议时想到了多个 CPU 线程执行单元,我收回了 -
@NitinDandriyal 理想情况下,count 应该是
AtomicInteger。
标签: java multithreading thread-synchronization