想验证一下多
线程下数据共享出错的问题,在下面的程序中定义了一个简单的
堆栈,并且两个线程向堆栈中压入数据和弹出数据。为了让它出错,在 MyStack 类中,当数据存入到数组之后,指针修改之前调用了 Thread.sleep 方法使之休眠。但后来将这一段代码加上
同步锁之后,似乎没起到同步的作用啊 
代码如下: 
package nit.
thread; 
class MyStack{ 
private int[] data = new int[10]; 
private int p = 0; 
public void push(int value){ 
synchronized(this){ 
data[p] = value; 
System.out.print("正在向位置 " + p + " 压入数据: " + value); 
try{ 
Thread.sleep(100); 
}catch(Exception ex){} 
p++; 
System.out.println(" 压入数据完成"); 
} 
} 
public int[] pop(){ 
p--; 
return new int[]{data[p-1], p}; 
} 
} 
class PushThread extends Thread{ 
private MyStack stack; 
PushThread(MyStack stack){ 
this.stack = stack; 
} 
public void run(){ 
stack.push(100); 
} 
} 
class PopThread extends Thread{ 
private MyStack stack; 
PopThread(MyStack stack){ 
this.stack = stack; 
} 
public void run(){ 
System.out.println(" 取出数据,top = " + stack.pop()[1] + " 完成"); 
} 
} 
public class TestStack { 
public static void main(String[] args){ 
MyStack stack = new MyStack(); 
stack.push(10); 
stack.push(20); 
PushThread t1 = new PushThread(stack); 
PopThread t2 = new PopThread(stack); 
t1.start(); 
t2.start(); 
} 
} 
----------------------------------------------------------------------
synchronized(this)只锁语句块 
不锁对象本身 
--------------------------------------------------------
public int[] pop(){ 
p--; 
return new int[]{data[p-1], p}; 
} 
p--就不需要同步了么?