请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

重排序,12-6这一节代码

第12-6这一节,我的idea在编辑代码的时候,CountDownLatch latch = new CountDownLatch(1); 这行代码,必须要加final关键字,才不报错。提示:Variable ‘latch’ is accessed from within inner class, needs to be declared final。

为什么,看视频,老师好像没有加这个,都能正常运行呢。
![图片描述](http://img1.sycdn.imooc.com/szimg/5e0603b50859b8ec12161312.jpg
图片描述

完整代码:

package concurrencyknowledge.jmm;

import java.util.concurrent.CountDownLatch;

/**
 * @Created by jasyu 2019/12/26
 *
 * 1. a=1;x=b(0);b=1;y=a(1)         x=0,y=1
 * 2. b=1;y=a(0);a=1;x=b(1)         x=1,y=0
 * 3. b=1;a=1;x=b(1);y=a(1)         x=1,y=1
 */
public class OutOfOrderException {
    private static int a = 0, x = 0;
    private static int b = 0, y = 0;

    public static void main(String[] args) throws InterruptedException {
        int i = 0;
        for (; ;) {
            i++;
            a = 0;
            x = 0;
            b = 0;
            y = 0;

            final CountDownLatch latch = new CountDownLatch(1);
            Thread one = new Thread(new Runnable() {
                public void run() {
                    try {
                        latch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    a = 1;
                    x = b;
                }
            });

            Thread two = new Thread(new Runnable() {
                public void run() {
                    try {
                        latch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    b = 1;
                    y = a;
                }
            });

            one.start();
            two.start();
            latch.countDown();
            one.join();
            two.join();

            String result = "[run " + i + "times] x = " + x + ", y = " + y;
            if (x == 1 && y == 1) {
                System.out.println(result);
                break;
            } else {
                System.out.println(result);
            }
        }
    }
}

正在回答 回答被采纳积分+3

3回答

悟空 2019-12-27 23:27:40

看下这里:

https://img1.sycdn.imooc.com//szimg/5e0622eb09bbb4f511880504.jpg

0 回复 有任何疑惑可以回复我~
  • 提问者 IBelieveYY #1
    终于解决了。太谢谢了,这么耐心的帮我解决这个小问题。
    回复 有任何疑惑可以回复我~ 2019-12-28 13:13:32
  • 悟空 回复 提问者 IBelieveYY #2
    不客气。最后是怎么解决的呢?说出来和大家分享一下。
    回复 有任何疑惑可以回复我~ 2019-12-28 13:41:57
悟空 2019-12-27 21:16:46

你版本是java8吗

0 回复 有任何疑惑可以回复我~
  • 提问者 IBelieveYY #1
    jdk1.8的,我也截图贴上了。
    回复 有任何疑惑可以回复我~ 2019-12-27 21:24:45
  • 悟空 回复 提问者 IBelieveYY #2
    不用加final是1.8的新特性,参考:
    https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html#accessing-members-of-an-enclosing-class
    https://blog.csdn.net/u014285517/article/details/46945453
    https://blog.csdn.net/yidou120/article/details/83998431
    回复 有任何疑惑可以回复我~ 2019-12-27 23:25:27
悟空 2019-12-27 15:09:15

你对比一下我的代码,看看是不是哪里不一样。

https://img1.sycdn.imooc.com//szimg/5e05ae36090a624913222102.jpg


0 回复 有任何疑惑可以回复我~
  • 提问者 IBelieveYY #1
    老师,你看。我在idea里面编辑的时候,必须要加final才不报错。对比了你的代码,没发现有啥不一样的呢。真不清楚是我idea设置问题,还是啥原因。老师你的代码,不加final又是正常的。
    回复 有任何疑惑可以回复我~ 2019-12-27 21:17:00
  • 悟空 回复 提问者 IBelieveYY #2
    你的完整代码,贴一下,不要图片,要文字,我试试。
    回复 有任何疑惑可以回复我~ 2019-12-27 21:36:27
  • 悟空 回复 提问者 IBelieveYY #3
    你看一下这个:https://stackoverflow.com/questions/14425826/variable-is-accessed-within-inner-class-needs-to-be-declared-final
    回复 有任何疑惑可以回复我~ 2019-12-27 21:37:23
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信