【问题标题】:Unable to understand sync无法理解同步
【发布时间】:2018-04-21 17:41:43
【问题描述】:

嘿,我正在尝试以同步方式创建 10 个线程,我想出了下面的代码,但是我无法理解下面提到的其中一部分。我对java还是很陌生,我尝试从 Here 但我还是一无所知。

class question3 {
    public static void main(String arg[]) throws Exception {
        for (int i = 0; i < 11; i++) {
            data di = new data();
            System.out.println(di.count);

        }
    }
}

class item {
    static int count = 0;
}

class data extends item implements Runnable {
    item d = this;
    Thread t;

    data() {
        t = new Thread(this);
        t.start();
    }

    public void run() {
        d = syn.increment(d);
    }
}

class syn {
    synchronized static item increment(item i) {
        i.count++;
        return (i);
    }

}

我不确定这部分代码的作用是什么?

public void run() {
        d = syn.increment(d);
    }
}

class syn {
    synchronized static item increment(item i) {
        i.count++;
        return (i);
    }
}

【问题讨论】:

  • 请修正您的代码缩进。
  • "我想出了代码" - "我不确定这部分代码的作用" - 你的意思是“我复制了代码”,对吗?最好问问作者它是做什么的。另一个获取信息的好地方是official Oracle Lesson on Concurrency。但老实说,如果您是 Java 新手,请从 basics 开始。代码注释:类名应始终以大写字母开头。
  • @Turing85 我明白发生了什么,但我不明白为什么要传递对象 d 以及 di.count 是如何工作的?
  • 这与同步无关。 di.count 访问实例di 的字段count(其类型为data,继承自item)。正如我之前所说:从基础开始。
  • 这不是我要问的,我想了解为什么需要d=syn.increment(d)

标签: java multithreading synchronization


【解决方案1】:

run 函数在启动线程时使用,这是您在实现Runnable 时需要重写的必须函数。调用Thread.start()时,会调用run函数。

class syn 包含一个同步方法,它只是意味着每次只有一个线程可以访问它,从而使incerment 函数线程安全。

对象d 有一个静态变量count,这意味着item 类(和data)的所有实例共享相同的count,因此所有线程都会递增相同的变量

d = syn.increment(d); 行基本上是 count++,但以线程安全的方式

【讨论】:

  • 我明白发生了什么,但我不明白为什么要传递对象 d 以及 di.count 是如何工作的?
猜你喜欢
  • 2014-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
  • 2017-11-04
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多