Java 访问外部类中的静态变量时静态内部线程出现问题
这个问题困扰了我很长时间,请帮助我,谢谢。 这是我的java代码Java 访问外部类中的静态变量时静态内部线程出现问题,java,multithreading,static,thread-safety,Java,Multithreading,Static,Thread Safety,这个问题困扰了我很长时间,请帮助我,谢谢。 这是我的java代码 package com.concurrent.example; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * P683 */ class CircularSet { private int[] array;
package com.concurrent.example;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
* P683
*/
class CircularSet {
private int[] array;
private int len;
private int index = 0;
public CircularSet (int size) {
array = new int[size];
len = size;
for (int i = 0; i < size; i++) {
array[i] = -1;
}
}
public synchronized void add(int i ) {
array[index] = i;
index = ++index % len;
}
public synchronized boolean contains(int val) {
for (int i = 0; i < len; i++) {
if(array[i] == val) {
return true;
}
}
return false;
}
}
public class SerialNumberChecker {
private static final int SIZE = 10;
private static CircularSet serials = new CircularSet(1000);
private static ExecutorService exec = Executors.newCachedThreadPool();
private static int serial;
static class SerialChecker implements Runnable {
@Override
public void run() {
while(true) {
//int serial;
synchronized (serials) {
serial = SerialNumberGenerator.nextSerialNumber();
}
if (serials.contains(serial)) {
System.out.println("Duplicate: " + serial);
System.exit(0);
}
System.out.println(serial);
serials.add(serial);
}
}
}
public static void main(String[] args) throws InterruptedException {
for (int i = 0; i < SIZE; i++) {
exec.execute(new SerialChecker());
if (args.length > 0) {
TimeUnit.SECONDS.sleep(new Integer(args[0]));
System.out.println("No duplicates detected");
System.exit(0);
}
}
}
}
对于私有静态int-serial,所有SerialNumberChecker共享同一个序列。例如:
螺纹1系列=1
螺纹2设置串行=2
螺纹1将2放入循环集。
Thread2发现它已复制并退出。
但是,如果在run方法中声明另一个int-serial,它将隐藏私有静态int-serial,这意味着所有线程都有自己的序列,它们将分配并检查它。由于串行数据的生成在synchronized块中,因此不会有重复数据。您首先要阅读一些有关静态数据的内容。看起来你真的不明白这个关键字在做什么。我知道你说什么,但是这个代码的结果synchronized serials{serial=SerialNumberGenerator.nextSerialNumber;}应该只得到一个值。当我注释//int serial,为什么它可以重复。@bfq是的,SerialNumberGenerator不会返回重复的值。但是,不同的线程正在处理同一个序列。考虑一下我在回答中的执行顺序。请注意,Thread1可以获取Thread2设置的值,因为序列是静态的。
public class SerialNumberGenerator {
private static volatile int serialNumber = 0;
public static int nextSerialNumber() {
return serialNumber ++; //Not thread-safe
}
}