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

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输出的是变量副本,还没重主内存把 最新的变量读进来

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥65 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?