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来演示一个竞赛。竞赛条件的问题在于它是非常随机的,因为它取决于许多因素。你可以运行一个程序一百次而没有问题,同样的程序在每次尝试时都会遇到问题。