当前位置: 代码迷 >> Java相关 >> java线程与应用程序共用数组有关问题
  详细解决方案

java线程与应用程序共用数组有关问题

热度:40   发布时间:2016-04-22 19:55:44.0
java线程与应用程序共用数组问题
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;
}
}

看看这代码能不能满足你的需求。。。。
  相关解决方案