zhang7324199
2016-10-30 13:48
采纳率: 33.3%
浏览 1.3k
已采纳

java并发访问一个变量问题

 public class Test2 {
    public static int count = 0;

    public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while(count<=20){
                    System.out.println(Thread.currentThread().getName()+":"+count);
                    count++;
                }

            }
        }).start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                while(count<=20){
                    System.out.println(Thread.currentThread().getName()+":"+count);
                    count++;
                }

            }
        }).start();
    }

}

输出:Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-1:6
Thread-1:8
Thread-1:9
Thread-0:7
Thread-1:10
Thread-0:11
Thread-1:12
Thread-0:13
Thread-1:14
Thread-0:15
Thread-1:16
Thread-0:17
Thread-1:18
Thread-1:20
Thread-0:19

当线程一输出9的时候,线程0确输出了7.
我就不理解了,当线程1切换到线程0的时候,至少应该输出>=9才对

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • zhang7324199 2016-10-30 14:52
    已采纳

    我网上查了下有这段话:(每个线程都有自己的执行空间(即工作内存),线程执行的时候用到某变量,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作:读取,修改,赋值等,这些均在工作内存完成,操作完成后再将变量写回主内存)

    是不是可以这么理解:线程1输出的是变量副本,还没重主内存把 最新的变量读进来

    点赞 评论
  • 程序男 2016-10-30 14:18

    你这样想就不对了嘛,因为你的代码根本没有考虑并发控制下如何让count++,你仅仅是用了两个线程去循环拿count值,没有用到相关的并发控制机制。

    点赞 评论
  • janjao 2016-10-30 23:23

    首先得明白一个概念,两个线程是随机抢夺cpu执行的,你这个问题是在0线程执行到6的时候,整个语句还没有执行完毕,但是count自增,这个时候线程1进来了,执行了7,当线程1还没有执行完毕的时候,coutn自增了,然后线程0进来,执行了8和9,这个时候线程1执行的7才执行完毕。

    点赞 评论
  • 有头发的猿 2016-10-31 00:03

    你好,你同时开启两个线程去遍历的话在控制台打印的线程是cpu控制的,cpu要哪个线程走哪个线程就走,不是你想他怎么走就怎么走,这是无法预料的,不信你可以多运行几次,每次运行结果都可能不一样,但如果你运气好可能会有一样的情况,如果你想控制了两个线程谁先走谁后走,因为多线程是会有安全隐患的,所以你得解决多线程的安全问题,了解了多线程的安全之后你就可以控制他们了,具体怎么解决多线程的安全我是写了博客的,你可以参考一下
    http://blog.csdn.net/qq_33750826/article/details/52605195

    点赞 评论
  • _1_1_7_ 2016-10-31 00:21

    Thread-1:9
    Thread-0:7
    当Thread-0执行System.out.println(Thread.currentThread().getName()+":"+count);时,
    这时候count已经是7,作为参数传递到println方法,println应该有个局部变量保存了count的值(7),
    然后线程暂停,Thread-1抢占了资源连续执行了两次System.out.println和count++后,Thread-0继续输出7

    点赞 评论
  • 小祝特烦恼 2016-10-31 01:46

    首先你应该理解什么叫并发处理。

    点赞 评论
  • 开发小哥 2016-10-31 02:05

    嗯,多线程执行是随机的,执行时间也是不可控的,你不知道那个先完成,那个后完成,你可以配个线程池去控制线程的执行!

    点赞 评论

相关推荐 更多相似问题