当前位置: 首页 > 知识库问答 >
问题:

为什么我们使用同步关键字,而我们使用多线程的目标是并行计算?

柯建修
2023-03-14

我们使用多线程的目的是并行计算,但这里我们使用synchronized关键字来允许一次使用一个线程。那么我们如何实现并行计算呢?如果可能,请提供一些相关的可理解编码示例。

class Counter {
    int count;
    
    public synchronized void increment() {
        count++;
    }
}

public class SyncDemo {
    public static void main(String[] args) throws Exception {
        Counter c = new Counter();
        
        Thread t1 = new Thread(new Runnable() {
           public void run() {
               for (int i=1; i<=1000; i++) {
                   c.increment();
               }
           } 
        });
        
        Thread t2 = new Thread(new Runnable() {
           public void run() {
               for (int i=1; i<=1000; i++) {
                   c.increment();
               }
           } 
        });
        
        t1.start();
        t2.start();
        
        t1.join();
        t2.join();
        
        System.out.println("Count: " + c.count);
    }
}

N、 这段代码来自YouTube视频。

共有1个答案

谷梁波
2023-03-14

您的两个线程改变了一个共享状态,即计数器。由于Java递增不是原子操作,count称为临界区,必须防止多个线程同时进入。为此,您的代码在方法增量()上使用同步关键字。

如果你想并行计数,就不要分享计数器。

为每个线程提供自己的计数器实例,然后 increment() 永远不会一次被计数器实例上的多个线程调用。那里不需要更多的线程同步。

这并不意味着您根本不需要协调线程:因为您想要输出总计数,所以只有当所有线程都完成了工作时,才能这样做。一种方法是像main方法那样连接线程。然后,您可以输出单个计数的总和。

 类似资料:
  • 问题内容: 好的,假设我们有两个表,和。在评论中,我们有一列,它表示哪个用户键入了该特定评论。为什么我们需要将其指定为外键?如果我们不这样做,它将仍然有效。我们指定主键,因为据我所知,它可以使查询速度更快(我们只需要搜索一行,而当我们没有主键/索引时,则必须遍历所有行)。这只是一种良好的编码习惯吗? 问题答案: 使用外键时,您将获得: 数据的完整性 更快的查询。 用户: 用户ID: 1个 2个 3

  • 问题内容: 我是一个完整的初学者。 我已阅读了有关解决方案的Google文档。我在互联网上搜索了同样的内容。 但。一切似乎都是技术性的。 据我了解,.Flush有助于在功能出现时立即执行这些功能,而无需将它们捆绑在一起。 我对吗? 如果不是的话,外行人的含义是什么?并请举一个简单的例子。谢谢。 问题答案: 程序员在希望确保在继续之前将先前代码的输出和/或效果写入电子表格时会使用。如果您不这样做,则

  • 问题内容: 我正在阅读Java JDBC规范(版本4),并且遇到了以下语句: DataSource-此接口在JDBC 2.0可选软件包API中引入。它优于DriverManager,因为它允许有关基础数据源的详细信息对应用程序透明 我想了解的是a 和a 之间的区别以及它为什么存在。我的意思是,上面的代码块说关于数据源的详细信息对于应用程序是透明的,但是是否不会在属性文件中外部化数据库属性(例如用户

  • 我试图理解的是和之间的区别,以及它存在的原因。我的意思是,上面的块表明关于数据源的细节对应用程序是透明的,但是在属性文件中外部化数据库属性如用户名、密码、url等,然后使用DriverManager是否会以同样的方式工作? 创建接口是否只是为了有一种返回可以池化的连接的通用方式?在Java EE中,应用程序服务器是否实现了这个接口,并且部署的应用程序是否具有对数据源的引用而不是连接?

  • 问题内容: 据我所知,以下两个代码段将达到相同的目的。为什么有块呢? 代码A: 代码B: 问题答案: 如果您未处理的异常被抛出会怎样?(我希望你不会抓到…) 如果从try块内部返回会怎样? 如果catch块引发异常会怎样? 一个代码块确保 无论 您退出该代码块(以几种方式明确地中止整个过程),该代码块都将被执行。这对于确定性清除资源很重要。

  • 为什么我们没有在下面的程序中使用关键字?