求教,关于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();
}
}
{
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在同一个方法中用的太多个,或者单位时间内调用过多会导致死锁现象,这个要注意
----------------解决方案--------------------------------------------------------
谢谢啦。我这搞定了。自己调用了两次那个方法才会出现两个弹出。汗,自己没注意。不过谢谢啦。
----------------解决方案--------------------------------------------------------