java - 同步性能

标签 java multithreading thread-synchronization

这与我之前的问题类似,因为我仍然不清楚同步关键字。

这次我会说得很短。

private int count = 0;

synchronized void increment() {
    count++;
}

count 是一个实例变量,在 2 个线程之间共享。

如果线程 t1 和 t2 尝试增加计数,并且操作系统首先给 t1 增加计数的机会:-

t1 获取锁并原子地递增计数,递增计数所需的时间为 1 分钟(考虑)包括获取锁所需的时间。

但是线程 t2 呢,它必须等待锁被释放。 释放锁后,t2 现在以原子方式递增计数,这也需要 1 分钟。

因此,同步可以保证正确性,但执行起来也需要时间。线程的目的是在更少的时间内完成工作,那么为什么要在线程中使用同步,它的用途是什么。

我的理解正确吗?

最佳答案

是的,使用同步会带来性能损失。这里的并发是为了保证共享变量读写的完整性。在您的情况下,如果没有同步,t1和t2可能会读取具有相同值的count(例如1),因此当两个线程退出时,count的值是2,即使您应该期望它是3(因为它增加了两倍)

关于java - 同步性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30161724/

相关文章:

java - Eclipse中刷新文件夹(包)后自动添加包声明

c++ - 需要设计建议 C++ : Want to implement a threaded queue for other threads to pass data

java - Java SE应用程序上带有C3P0的DEADLOCK

C# 根据字符串同步线程

.net - 学习实现线程池-使用autoresetevent时,信号事件丢失

java - 创建 com.rits.cloning.Cloner 昂贵吗?

java - drools 6.0 中未知的 KieSession 名称(尝试将 drools 添加到现有的 maven/eclipse 项目中)

java - 使用队列和信号量模拟客户/员工线程

java - OSGi - 为什么我的包名为 "unknown-0.0.0"且 MANIFEST.MF 文件被覆盖?

c++ - std::shared_timed_mutex 上的共享锁可以升级为独占锁吗?