首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个同步方法不能像预期的那样工作?

为什么这个同步方法不能像预期的那样工作?
EN

Stack Overflow用户
提问于 2015-11-03 21:38:59
回答 2查看 108关注 0票数 0

我有一个名为MyRunnable的类:

代码语言:javascript
复制
public class MyRunnable extends Main implements Runnable  {
  String name; // name of thread
  Thread t;

  MyRunnable (String threadname) {
      name = threadname;
      t = new Thread(this, name);
      t.start();
  }

  public void run() {
      try {
          for (int i=0;i<100000;i++) {
              extend(1);
          }
      } catch (InterruptedException e) {
          System.out.println("Thread interrupted.");
      }
      System.out.println("Thread " +  name + " exiting.");
  }

}

还有一个叫Main的班级:

代码语言:javascript
复制
public class Main {
  private static List<Integer> numbers=new ArrayList<>();

  public synchronized void extend (int i) throws InterruptedException {
      numbers.add(i);
  }
  public synchronized static int getSize() {
      return numbers.size();
  }

  public static void main(String[] args) {
      MyRunnable t0=new MyRunnable("0");
      MyRunnable t1=new MyRunnable("1");
      MyRunnable t2=new MyRunnable("2");

      try {
          t0.t.join();
          t1.t.join();
          t2.t.join();
      } catch (InterruptedException e) {

      }
      System.out.println(getSize());
  }
}

现在,我希望得到300000作为输出,但我得到一个随机数(大约。250000到290000之间),尽管我确实使用了同步方法。我确实读过甲骨文的文档http://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html,但我似乎不明白为什么它不像预期的那样工作。有人能解释一下为什么吗?

提前感谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-03 21:43:28

方法与调用它们的对象同步。您需要在每个对象之间创建一个共享的对象,并让它们在该对象上同步。

代码语言:javascript
复制
private static List<Integer> numbers=new ArrayList<>();
public synchronized void extend (int i) throws InterruptedException {
    synchronize(numbers) {
        numbers.add(i);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2015-11-03 21:42:52

synchronized在这里锁定了调用extend方法的对象(因为它是一个实例方法)。因此,您正在对三个不同的对象进行同步。

如果您在共享static列表上进行同步(例如),您将得到预期的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33509564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档