如何同步堆栈?

时间:2014-07-01 01:40:23

标签: java multithreading synchronized

我是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;
            }



        }


    }



}

1 个答案:

答案 0 :(得分:3)

Java堆栈同步。 Stack扩展Vector,已同步。两者都是半弃用的。建议使用ArrayDeque代替StackArrayList代替Vector。但是,由于在这种情况下你实际上想要同步,也许你应该坚持使用Stack

这没有做任何事情:

Collections.synchronizedList(s1);

Collections.synchronizedList会返回该集合的包装版本,但由于您未保存返回的值,因此除了浪费资源外,它实际上并没有做任何事情。 s1仍然指向未展开的堆栈,但由于Stack已经同步,因此可能没问题。您应该将电话转到synchronizedList

从同步的角度来看,我认为您发布的内容应该可以正常运行。看起来你有一个或多个线程推送到堆栈,但只有一个线程从堆栈中弹出。在这种情况下,当您尝试s1时,您确保pop()已经空了。如果您从堆栈中弹出多个线程,则此代码不安全,因为在您检查size()==3和尝试pop()的位置之间会发生大量内容。