当前位置: 代码迷 >> Java相关 >> 求教,关于java中的线程同步问题。
  详细解决方案

求教,关于java中的线程同步问题。

热度:325   发布时间:2013-10-02 16:49:57.0
求教,关于java中的线程同步问题。
在学习java时,看到线程的时候,书上说了一个关于线程同步的问题。可是我自己敲了一下运行了结果不一样。看了半天没看懂,特来求教。
程序代码:
public interface StackInterface
{
    public void push(int n);
    public int[] pop();
}

public class SafeStack implements StackInterface
{
    private int top = 0;
   
    private int[] values = new int[10];
   
    public void push(int n)
    {
        synchronized (this)
        {
            values[top] = n;
            System.out.println("压入数字" + n + "步骤1完成");
            top++;
            System.out.println("压入数字完成");
         }
    }
   
    public int[] pop()
    {     synchronized (this)
        {
            System.out.print("弹出");
            top--;
            int[] test = {values[top], top };
             return test;   
        }
    }
}


public class PopThread implements Runnable
{
    private StackInterface s;
   
    public PopThread(StackInterface s)
    {
        this.s = s;
    }   
    public void run()
    {
        System.out.print(s.pop()[1] + ":" +" "+ s.pop()[0]);   
        
    }
}


public class PushThread implements Runnable
{
    private StackInterface s;
   
    public PushThread(StackInterface s)
    {
        this.s = s;
    }   
   
    public void run()
    {
        /*for(int i = 0; i < 10; i ++)
        {
            System.out.print(".");   
        }
*/   
        int k = 15;
        s.push(k);
    }
}


public class TestSafeStack
{
    public static void main(String[] args)
    {
        SafeStack a = new SafeStack();
        a.push(3);
        a.push(4);
        PushThread r1 = new PushThread(a);
        PopThread r2 = new PopThread(a);
        Thread t1 = new Thread(r1);
        Thread t2 = new Thread(r2);
        t1.start();
        t2.start();   
    }   
}

在class SafeStack 中已经用了synchronized修饰两个方法了。为什么还是会输出两个不同的结果?不是应该一个吗?

在class PushThread  中我加注释的部分,只是为了输出一列点而已。为什么会影响结果?
在结果中为什么有时候会显示两个“弹出”?
搜索更多相关的解决方案: java  

----------------解决方案--------------------------------------------------------
大神们,求指点啊。
----------------解决方案--------------------------------------------------------

----------------解决方案--------------------------------------------------------
国庆刚回来,看到你的代码,一个屏幕看不下,就没有看了,我也木蚂蚁打开myeclipse运行,就简单说下你的问题,
在class SafeStack 中已经用了synchronized修饰两个方法了。为什么还是会输出两个不同的结果?不是应该一个吗?
上面这句话,你问的是不是你用synchronized修饰了没有用还是什么?
synchronized这个关键字,只是相当于一个同步锁,它只允许单个线程进行访问该内存。
当执行结束之后才会执行其他的,这个肯定是没有问题的,你说的什么打印,你看下是不是你程序的逻辑有问题。还有如果synchronized在同一个方法中用的太多个,或者单位时间内调用过多会导致死锁现象,这个要注意
----------------解决方案--------------------------------------------------------
谢谢啦。我这搞定了。自己调用了两次那个方法才会出现两个弹出。汗,自己没注意。不过谢谢啦。
----------------解决方案--------------------------------------------------------
  相关解决方案