| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 389 人关注过本帖
标题:求教,关于java中的线程同步问题。
只看楼主 加入收藏
第二个木鱼
Rank: 2
等 级:论坛游民
帖 子:17
专家分:24
注 册:2012-3-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
求教,关于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 
2013-10-02 16:49
第二个木鱼
Rank: 2
等 级:论坛游民
帖 子:17
专家分:24
注 册:2012-3-7
收藏
得分:0 
大神们,求指点啊。
2013-10-02 17:06
第二个木鱼
Rank: 2
等 级:论坛游民
帖 子:17
专家分:24
注 册:2012-3-7
收藏
得分:0 
2013-10-03 14:08
java小蚂蚁
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:上海
等 级:贵宾
威 望:18
帖 子:558
专家分:2186
注 册:2013-7-2
收藏
得分:20 
国庆刚回来,看到你的代码,一个屏幕看不下,就没有看了,我也木蚂蚁打开myeclipse运行,就简单说下你的问题,
在class SafeStack 中已经用了synchronized修饰两个方法了。为什么还是会输出两个不同的结果?不是应该一个吗?
上面这句话,你问的是不是你用synchronized修饰了没有用还是什么?
synchronized这个关键字,只是相当于一个同步锁,它只允许单个线程进行访问该内存。
当执行结束之后才会执行其他的,这个肯定是没有问题的,你说的什么打印,你看下是不是你程序的逻辑有问题。还有如果synchronized在同一个方法中用的太多个,或者单位时间内调用过多会导致死锁现象,这个要注意

学海无涯#¥%……&*(
2013-10-06 21:22
第二个木鱼
Rank: 2
等 级:论坛游民
帖 子:17
专家分:24
注 册:2012-3-7
收藏
得分:0 
谢谢啦。我这搞定了。自己调用了两次那个方法才会出现两个弹出。汗,自己没注意。不过谢谢啦。
2013-10-07 10:53
快速回复:求教,关于java中的线程同步问题。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013561 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved