【发布时间】:2022-01-11 07:48:37
【问题描述】:
下面的类包含同步的arraylist和两个方法,一个是清除和添加arrayLIst,另一个是获取列表。
public class Singleton {
private static Singleton singleton;
private List<String> strList = Collections.synchronizedList(new ArrayList<String>());
private Singleton() {
}
public static synchronized Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
public void addElement(List<String> list) {
strList.clear();
strList.addAll(list);
}
public List<String> getStrList(){
return new ArrayList<>(strList);
}
}
当 addElement 和 getStrList 在两个不同的线程中调用时,有时会得到空列表。
public class App
{
public static void main(String[] args) throws InterruptedException
{
final Singleton singleton = Singleton.getInstance();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<100; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
if(i<=50) {
singleton.addElement(Arrays.asList("ONE"));
} else {
singleton.addElement(Arrays.asList("TWO"));
}
}
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for(int i=0; i<100; i++) {
System.out.println(singleton.getStrList());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t1.start();
t2.start();
}
}
输出:
[TWO]
[]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
[]
[TWO]
[TWO]
[TWO]
[TWO]
[TWO]
在两者之间有返回的空列表。当 getStrList 方法中的列表为空时,如何在不添加睡眠的情况下解决此问题?也在寻找更好的替代方法来实现这一点。
【问题讨论】:
-
你遇到了消费问题,即使没有消费。等待并通知如何?
标签: java multithreading