【问题标题】:Same method accessed by multiple threads多个线程访问相同的方法
【发布时间】:2011-12-31 02:44:42
【问题描述】:

我有一个方法可以被java程序中的多个线程访问。这个方法有:

  1. 全局对象变量
  2. 局部变量
  3. 形式参数。

现在这个方法是不同步的,所以当多个线程改变上述三种变量的值时,这些变化会反映到其他线程还是每个线程都有这些变量的单独副本。

【问题讨论】:

标签: java multithreading


【解决方案1】:

全局对象:将反映变化

局部变量:不会

形式参数:对象引用会反映变化,原始类型的参数不会反映变化。

【讨论】:

    【解决方案2】:

    全局对象将被更改, 本地变量不会 如果参数是对象,则可以更改参数,如果它们是整数等原始类型,则不会更改。即使它们是对象,如果每个线程在调用方法之前创建它们并且它们没有被重用,它们也可能不会改变。

    但这还不是全部,因为你无法控制执行顺序,即使有一个线程正在处理,它们也会随机变化,所以如果你说一个全局变量 int myVar =0;

    方法确实

    { // 第 10 行 我的变量 = 1; // 第 11 行 myVar += 7; // 第 12 行 } // 第 13 行

    根本无法保证该变量在第 12 行的开头为 1,因为其他线程可能在程序从第 11 行到第 12 行的时间内更改了该值。

    归根结底,这是灾难的根源。您需要同步方法或为全局变量和作为参数传递的对象添加锁。

    【讨论】:

      【解决方案3】:

      这里的一些其他答案忘记提到一个非常重要的事实。

      对作为参数传递的对象和全局变量的更改与其他线程共享,但是:

      如果没有同步,您将永远不知道何时(也许永远不会!)这些更改将显示在其他线程中。 除了同时只允许方法中的一个线程防止 100 种竞争条件之外,进入和退出同步块也将触发所有缓存被清除并在线程/核心之间共享数据。

      多线程很难正确处理,请仔细阅读。我推荐 Goetz 的“Java Concurrency in Practice”。

      【讨论】:

        猜你喜欢
        • 2015-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 2013-02-26
        • 1970-01-01
        • 2012-01-25
        • 1970-01-01
        相关资源
        最近更新 更多