java线程循环不停扫描数组数据,线程启动后,通过应用程序别的方法向这个数组中加数据后,线程中仍读不到应用程序添加进来的数组数据。
不知其他大侠有没有遇到过这种问题。
------解决思路----------------------
代码问题啊,你这么说好抽象的。
------解决思路----------------------
多线程共享数据时必须确保可见性和安全性,关键字Volatile可保证可见性,但不保证安全性
你用的ArrayList既没有保证可见性,也没有保证安全性,可以用线程安全的容器,有同步容器如Vector, Hashtable,并发容器CopyOnWriteArrayList等等
现代JVM有许多优化功能,为了提高性能,有些数据在操作过程中数据会缓存在寄存器中,对其他线程是不可见的,
有些操作由于JVM的重排序,也会导致不可见
线程安全的内容很多,不是一两句说得清的
------解决思路----------------------
顶楼上,推荐用队列
------解决思路----------------------
public class Demo {
public static void main(String[] args) {
final Res resource = new Res();
new Thread(new Runnable() {
private boolean isRunning = true;
@Override
public void run() {
// while (isRunning) {
// resource.get();
// }
for (int i = 0; i < 1000; i++) {
System.out.println("扫描到当前元素:" + resource.get());
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
resource.put(i);
System.out.println("成功添加 :" + i);
}
}
}).start();
}
}
class Res {
private List<Integer> array = new ArrayList<Integer>();
private ListIterator<Integer> iterator = array.listIterator();
Res() {
iterator.add(50);
iterator.add(60);
iterator.add(70);
}
public synchronized void put(Integer data) {
iterator.add(data);
}
public synchronized Integer get() {
if (iterator.hasNext()) {
Integer data = iterator.next();
return data;
}
else {// 迭代到结尾或者集合已空
// 集合空
if (array.isEmpty())
return null;
// 集合非空
iterator = array.listIterator();
Integer data = iterator.next();
return data;
}
}
看看这代码能不能满足你的需求。。。。