当类中的counter较大时,为什么java线程的行为会有所不同?

科雷旅

这是我的代码:

public class MyRunnableClass implements Runnable {

    static int x = 25;
    int y = 0;
    private static final Object sharedLock = new Object();


    @Override
    public void run() {
        while(x>0){
            someMethod();
        }
    }

    public synchronized void someMethod(){
        synchronized (sharedLock){
            x--;
            y++;
        }
    }
}

和测试类:

public class MyRunnableClassTest {

    public static void main(String[] args) throws InterruptedException {

        MyRunnableClass aa = new MyRunnableClass();
        MyRunnableClass bb = new MyRunnableClass();

        Thread a = new Thread(aa);
        Thread b = new Thread(bb);

        a.start();
        b.start();

        a.join();
        b.join();

        System.out.println(aa.y + bb.y);

    }
}

当我按原样运行此代码时,我看到输出25很好,但是当x为250时,我看到251。为什么?为什么不250?

在执行操作时:

    while(x>0){
        someMethod();
    }

假设x = 1并且:

线程A将x> 0评估为true,然后进入循环。假设线程A在下一行执行之前被中断。线程B还将x> 0评估为true并进入循环。

两者都将x依次递减,并将y递增。

为了解决这个问题,x> 0的检查也必须处于锁定状态。

前任:

public class MyRunnableClass implements Runnable {

static int x = 25;
int y = 0;
private static final Object sharedLock = new Object();


@Override
public void run() {
    while(x>0){
        someMethod();
    }
}

public synchronized void someMethod(){
    synchronized (sharedLock){
        if(x > 0){
            x--;
            y++;
       }
    }
}

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在for循环中更新Python生成器时,其行为会有所不同?

来自分类Dev

为什么Java正则表达式在Linux和Windows上的行为会有所不同?

来自分类Dev

为什么在Chrome / IE和Firefox中重新定义功能的行为会有所不同?

来自分类Dev

为什么分别编译和链接功能时性能会有所不同?

来自分类Dev

当计数器在我的班级较大时,为什么Java线程的行为会有所不同?

来自分类Dev

为什么在静态连接时Web套接字的延迟会有所不同?

来自分类Dev

为什么OOP中的静态类的最佳实践会有所不同?

来自分类Dev

为什么嵌套类在Java和C#之间的行为有所不同?

来自分类Dev

为什么在Dom对象中为其分配变量会有所不同

来自分类Dev

使用-all标志时,为什么pdfimages生成的图像会有所不同?

来自分类Dev

为什么使用默认构造函数构造std :: string对象时,其行为会有所不同?

来自分类Dev

为什么使用交叉元运算符时** 2和²的行为会有所不同?

来自分类Dev

为什么在具有一级索引的MultiIndex列的熊猫DataFrame中,行为会有所不同?

来自分类Dev

提供通用类型与直接类型时,为什么Typescript映射元组类型的行为会有所不同?

来自分类Dev

为什么在for循环中更新Python生成器时,其行为会有所不同?

来自分类Dev

在直接分配或从get-content检索数组时,为什么数组的行为会有所不同

来自分类Dev

为什么以foreach调用时,ForEach-Object的行为会有所不同?

来自分类Dev

使用-all标志时,为什么pdfimages生成的图像会有所不同?

来自分类Dev

为什么在使用ICustomTypeDescriptor时TypeDescriptor.GetProperties对于类型和对象的行为会有所不同

来自分类Dev

在当前shell中采购脚本时,“测试”比较的行为会有所不同

来自分类Dev

为什么JavaScript“删除”运算符在不同浏览器中的行为会有所不同?

来自分类Dev

为什么在静态连接时Web套接字的延迟会有所不同?

来自分类Dev

为什么我的html中的类顺序会有所不同?

来自分类Dev

为什么对于相同但按比例缩放的数据,绘图的行为会有所不同?

来自分类Dev

为什么从函数调用Bash的“源”命令的行为会有所不同?

来自分类Dev

为什么有时自己的敏捷状态会有所不同?

来自分类Dev

为什么在递增计数与递减计数时,for循环的行为会有所不同?

来自分类Dev

为什么在Dom对象中为其分配变量会有所不同

来自分类Dev

C 语言:为什么在 int 声明的变量中输入浮点数时结果会有所不同

Related 相关文章

  1. 1

    为什么在for循环中更新Python生成器时,其行为会有所不同?

  2. 2

    为什么Java正则表达式在Linux和Windows上的行为会有所不同?

  3. 3

    为什么在Chrome / IE和Firefox中重新定义功能的行为会有所不同?

  4. 4

    为什么分别编译和链接功能时性能会有所不同?

  5. 5

    当计数器在我的班级较大时,为什么Java线程的行为会有所不同?

  6. 6

    为什么在静态连接时Web套接字的延迟会有所不同?

  7. 7

    为什么OOP中的静态类的最佳实践会有所不同?

  8. 8

    为什么嵌套类在Java和C#之间的行为有所不同?

  9. 9

    为什么在Dom对象中为其分配变量会有所不同

  10. 10

    使用-all标志时,为什么pdfimages生成的图像会有所不同?

  11. 11

    为什么使用默认构造函数构造std :: string对象时,其行为会有所不同?

  12. 12

    为什么使用交叉元运算符时** 2和²的行为会有所不同?

  13. 13

    为什么在具有一级索引的MultiIndex列的熊猫DataFrame中,行为会有所不同?

  14. 14

    提供通用类型与直接类型时,为什么Typescript映射元组类型的行为会有所不同?

  15. 15

    为什么在for循环中更新Python生成器时,其行为会有所不同?

  16. 16

    在直接分配或从get-content检索数组时,为什么数组的行为会有所不同

  17. 17

    为什么以foreach调用时,ForEach-Object的行为会有所不同?

  18. 18

    使用-all标志时,为什么pdfimages生成的图像会有所不同?

  19. 19

    为什么在使用ICustomTypeDescriptor时TypeDescriptor.GetProperties对于类型和对象的行为会有所不同

  20. 20

    在当前shell中采购脚本时,“测试”比较的行为会有所不同

  21. 21

    为什么JavaScript“删除”运算符在不同浏览器中的行为会有所不同?

  22. 22

    为什么在静态连接时Web套接字的延迟会有所不同?

  23. 23

    为什么我的html中的类顺序会有所不同?

  24. 24

    为什么对于相同但按比例缩放的数据,绘图的行为会有所不同?

  25. 25

    为什么从函数调用Bash的“源”命令的行为会有所不同?

  26. 26

    为什么有时自己的敏捷状态会有所不同?

  27. 27

    为什么在递增计数与递减计数时,for循环的行为会有所不同?

  28. 28

    为什么在Dom对象中为其分配变量会有所不同

  29. 29

    C 语言:为什么在 int 声明的变量中输入浮点数时结果会有所不同

热门标签

归档