首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >方法同步问题。Java

方法同步问题。Java
EN

Stack Overflow用户
提问于 2015-11-19 18:17:06
回答 3查看 42关注 0票数 0

我试图理解Java中的多线程,我遇到了以下问题:我创建了20个线程,每个线程执行一个简单的递增和获取一些值的操作。请在下面找到代码片段:

代码语言:javascript
复制
public class MyClass {

public static void main(String[] args) {

  for (int i = 0 ; i < 20 ; i ++) {
     new Thread(() -> {
        System.out.println(Thread.currentThread().getName() + " == " + MyClass1.incAndGet());
     }).start();
  }

}

private static class MyClass1 {

  static private int s;

  private static synchronized int incAndGet(){
     return s ++;
  }

 }
}

这里访问incAndGet方法是同步的,因此没有线程可以在不一致的线程中找到s变量的状态。我不明白的是为什么输出如下:

代码语言:javascript
复制
Thread-0 == 2
Thread-11 == 10
Thread-14 == 12
Thread-15 == 9
Thread-18 == 14
Thread-13 == 8
....

它不应该是这样的:

代码语言:javascript
复制
Thread-0 == 0
Thread-11 == 11
Thread-14 == 14
Thread-15 == 15
Thread-18 == 18
Thread-13 == 13
....

如果我误解了同步的概念,你能提供好的和不好的同步的例子吗?谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-11-19 18:22:19

在线程作业中,通常有两个基本操作:incAndGet()System.out.println()。这些操作的顺序也不是连续的:这样的Thread-13可以执行incAndGet,然后Thread-18将执行incAndGet,然后Thread-18将在Thread-13之前执行System.out.println()。因此,如果您想要连续打印输出,则应该将incAndGetprintln同步

代码语言:javascript
复制
  synchronized (MyClass.class) {
                    System.out.println(Thread.currentThread().getName() + " == " + MyClass1.incAndGet());
                }
票数 0
EN

Stack Overflow用户

发布于 2015-11-19 18:23:09

不能保证Thread将以顺序方式执行。在不同的运行中,它会显示不同的输出。

票数 0
EN

Stack Overflow用户

发布于 2015-11-19 18:24:14

这些数字不匹配,因为调度程序运行线程的顺序与创建线程的顺序不同。线程名称是在创建时决定的,而数量s是在线程实际运行时计算的。

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

https://stackoverflow.com/questions/33800980

复制
相关文章

相似问题

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