我是Java的初学者。我编写了这个简单的代码,它接受来自用户的整数数据并将其推送到Stack中。线程不断检查堆栈的大小是否== 3.一旦堆栈达到这个大小,线程就会从Stack中弹出元素。我理解Stack不同步。因此我使用Collection.Synchronized方法来同步它。
此实施是否有效?
import java.util.Collections;
import java.util.Scanner;
import java.util.Stack;
public class StackSyncronisation<Item> extends Thread{
private Stack<Item> s1;
public StackSyncronisation(){
s1=new Stack<Item>();
Collections.synchronizedList(s1);
}
public void run(){
//System.out.println("Inside run method");
while(true){
if(s1.size()==3){
{
while(!s1.isEmpty()){
// Poping out
System.out.println("Poping out from Stack");
s1.pop();
}
}
}
}
}
public void push(Item d){
s1.push(d);
}
public static void main(String[]argc){
StackSyncronisation<Integer> x1=new StackSyncronisation<Integer>();
x1.start();
Scanner in=new Scanner(System.in);
while(true){
System.out.println("Enter 1:Push");
//in.nextInt();
switch (in.nextInt()) {
case 1: x1.push(in.nextInt());
break;
default:
break;
}
}
}
}
答案 0 :(得分:3)
Java堆栈已同步。 Stack
扩展Vector,已同步。两者都是半弃用的。建议使用ArrayDeque
代替Stack
,ArrayList
代替Vector
。但是,由于在这种情况下你实际上想要同步,也许你应该坚持使用Stack
。
这没有做任何事情:
Collections.synchronizedList(s1);
Collections.synchronizedList
会返回该集合的包装版本,但由于您未保存返回的值,因此除了浪费资源外,它实际上并没有做任何事情。 s1
仍然指向未展开的堆栈,但由于Stack
已经同步,因此可能没问题。您应该将电话转到synchronizedList
。
从同步的角度来看,我认为您发布的内容应该可以正常运行。看起来你有一个或多个线程推送到堆栈,但只有一个线程从堆栈中弹出。在这种情况下,当您尝试s1
时,您确保pop()
已经空了。如果您从堆栈中弹出多个线程,则此代码不安全,因为在您检查size()==3
和尝试pop()
的位置之间会发生大量内容。