日期:2014-05-20  浏览次数:20677 次

Java synchronized代码块同步问题
在学习Java多线程synchronized同步代码块的时候,运行下面的程序:
package Thread;
import java.util.LinkedList;

public class SynStack {
static LinkedList<String> list = new LinkedList<String>();
Object lock = new Object();
public synchronized void push(String x){
synchronized (lock) {
System.out.println("Add Object!");
list.addLast(x);
lock.notify();
}
}

public synchronized String pop() throws Exception{
//改成synchronized(this)时,wait()方法就可以释放持有的资源;
//为什么synchronized(list),synchronized(lock)就不可以?
synchronized (lock) {
if(list.size() <=0){
System.out.println("No enough Objects!");
lock.wait();
}
System.out.println("Awaking!");
return list.removeLast();
}
}

public static void main(String args[]){
final SynStack s = new SynStack();
Thread thread = new Thread(){
public void run() {
s.push(new String("First Thing!"));
}
};


Thread thread1 = new Thread(){
public void run() {
try {
System.out.println(s.pop());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
thread1.start();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
thread.start();

}
}
其中SynStack类中的pop()和push方法分别从list取出或加入元素,问题出在pop()方法中的同步代码块,其中对list的size做了判断,如果list中没有元素的话,就调动同步代码块锁对象的wait()方法;Java多线程关于wait()调用时有下面的论述:执行了锁所属对象的wait()方法,这个线程会释放对象锁,进入对象的等待池中。但是我使用SynStack的list或者lock作为对象锁都会产生死锁,使用this却不会。
百思不得其解,大家帮忙解决一下,不甚感激!!
java 多线程

------解决方案--------------------
public synchronized void push(String x)
public synchronized String pop() 
这两个方法在定义的时候就被申明为同步方法了。也就是已经对this加锁了,后面又对lock加锁。可能是这个原因导致的。去掉方法定义是的synchronized试一下。