Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 验证原语局部变量是线程安全的测试_Java_Multithreading - Fatal编程技术网

Java 验证原语局部变量是线程安全的测试

Java 验证原语局部变量是线程安全的测试,java,multithreading,Java,Multithreading,我写了下面的代码来增加版本数 if ("Solution".equalsIgnoreCase(modelName)) { mainsolution.setSolutionVersion(oldsolution.getSolutionVersion() + 1);} 我怀疑上面的代码可能无法在多线程环境中给出正确的结果,所以要测试我编写的下面的测试代码 import java.util.concurrent.ExecutorService; import java.util.concur

我写了下面的代码来增加版本数

if ("Solution".equalsIgnoreCase(modelName)) {
    mainsolution.setSolutionVersion(oldsolution.getSolutionVersion() + 1);}
我怀疑上面的代码可能无法在多线程环境中给出正确的结果,所以要测试我编写的下面的测试代码

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {

    public static void main(String[] args) {

        ExecutorService service = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {

            service.execute(new NotThreadsafe());
        }

        ExecutorService service1 = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 10; i++) {

            service1.execute(new Threadsafe());
        }

    }


}

class NotThreadsafe implements Runnable{
    int x = 1;
    public int incrementX() {
        x++;
        return x;
    }

    @Override
    public void run() {
        System.out.println("not safe:"+incrementX());
    }
}

class Threadsafe implements Runnable{
    public int getTwoTimesTwo() {
        int x = 1;
        x++;
        return x;
    }

    @Override
    public void run() {
        System.out.println("safe:"+getTwoTimesTwo());
    }
}
但我得到了2作为Threadsafe和NotThreadsafe的输出


我在上面的文章中写的测试有问题。

您不能简单地编写一个测试来演示基本局部变量的线程安全性

与另一个线程共享局部变量的唯一方法是在匿名类中引用它

但是,通过这样做,局部变量必须是final或有效final,因此不能在原始线程或匿名类中更新它


因此,所有线程都将看到该变量的最新值。从来没有线程安全问题。编译器保证这一点。

根据规范,基本局部变量是线程安全的。无需测试。在两个可运行类中,没有其他线程对变量进行操作。我不知道你的代码应该演示什么。我有点困惑。如何测试线程安全性?我的意思是共享资源在哪里。实际上,您正在将Runnable的一个新实例传递给每个执行器。假设代码被修改为共享NotThreadsafe的一个实例。您将非常幸运地通过这几次尝试和所有I/O来演示一个竞赛。竞赛条件的问题在于它是非常随机的,因为它取决于许多因素。你可以运行一个程序一百次而没有问题,同样的程序在每次尝试时都会遇到问题。