首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >同步问题

同步问题
EN

Stack Overflow用户
提问于 2011-09-07 18:21:51
回答 6查看 3K关注 0票数 4
代码语言:javascript
运行
复制
  public class PingPong implements Runnable {
      synchronized void hit(long n) {
          for (int i = 1; i < 3; i++)
              System.out.print(n + "-" + i + " ");
      }
      public static void main(String[] args) {
          new Thread(new PingPong()).start();
          new Thread(new PingPong()).start();
      }
      public void run() {
          hit(Thread.currentThread().getId());
      }
  }

上面的代码给出了输出8-1 9-1 8-2 9-2。

但是,由于函数是同步的,它应该给出输出8-1 8-2 9-1 9-2或9-1 9-2 8-1 8-2

有人能解释一下吗?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-09-07 18:25:56

方法上的“同步”同步特定对象上该方法的所有访问。

因此,如果您有一个PingPong对象,那么没有2个线程会同时输入它的hit方法,但是对于2个对象,一个线程可以输入其中一个对象的hit方法,而另一个线程运行另一个对象的hit对象。

这是有意义的,因为您通常使用synchronized来确保对当前对象本地内容的不受干扰的访问。如果您的对象表示线程有时需要不受干扰的访问的某个外部实体,则使您的对象成为单例。

票数 7
EN

Stack Overflow用户

发布于 2011-09-07 18:30:09

要获得您想要的行为,请尝试进行以下更改:

代码语言:javascript
运行
复制
 public class PingPong implements Runnable {
      synchronized void hit(long n) {
          for (int i = 1; i < 3; i++)
              System.out.print(n + "-" + i + " ");
      }
      public static void main(String[] args) {
          PingPong p = new PingPong();
          new Thread(p).start();
          new Thread(p).start();
      }
      public void run() {
          hit(Thread.currentThread().getId());
      }
  }

只有一个PingPong实例,hit()上的synchronized修饰符将防止一个线程中断另一个线程,您的输出要么是X-1 X-2 Y-1 Y-2,要么是visa-相反。

票数 4
EN

Stack Overflow用户

发布于 2011-09-07 18:26:25

根据http://download.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

首先,不可能对同一对象上的同步方法进行两次调用来交织。

因此,由于您有两个PingPong对象,所以同步关键字不像您预期的那样工作。

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

https://stackoverflow.com/questions/7338661

复制
相关文章

相似问题

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