首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

为什么加了lock还出现有关问题

2013-09-05 
为什么加了lock还出现问题?我在写一个很简单的stack。可是即使加了lock,也会出现concurrency的问题。比如按

为什么加了lock还出现问题?
我在写一个很简单的stack。可是即使加了lock,也会出现concurrency的问题。
比如按照下面的测试,会出现下面这种输出。
求解释!
Doing making set
get


package src;

public class StackNode {
private Object value;
private StackNode next;

private final Object lock = new Object();

public StackNode() {
setValue(null);
setNext(null);
}

public StackNode(Object o) {
value = 0;
next = null;
}

public StackNode(StackNode node) {
value = node.getValue();
next = node.getNext();
}

public synchronized Object getValue() {
System.out.print(" Doing ");
System.out.println(" get ");
System.out.flush();
return value;
}

public  synchronized void setValue(Object value) {
System.out.print(" making ");
System.out.println(" set ");
System.out.flush();
this.value = value;

}

public synchronized StackNode getNext() {
return next;
}

public synchronized void setNext(StackNode next) {
this.next = next;
}
}



测试代码:

public class TestStackNode {
private final static StackNode node = new StackNode();

@Test
public void getSetValueTest() throws InterruptedException{
node.setValue("bad");
Runnable setValue = new Runnable(){
@Override
public void run() {
node.setNext(new StackNode());
node.setValue("new");
}
};

Runnable getValue = new Runnable(){
@Override
public void run() {
Assert.assertEquals("new", node.getValue());
}
};
List<Thread> set = new ArrayList<Thread> ();
List<Thread> get = new ArrayList<Thread> ();
for (int i = 0; i < 30000; i++){
set.add( new Thread(setValue));
get.add(new Thread(getValue));
}

for (int i = 0; i < 30000; i++){
set.get(i).start();
get.get(i).start();
}

for (int i = 0; i < 30000; i++){
set.get(i).join();
get.get(i).join();
}
}


}


[解决办法]
你的入栈和出栈没写好
[解决办法]
StackNode.java

public class StackNode {
    private Object value;
    private StackNode next;
    private static Object locker=new Object();
     
    private final Object lock = new Object();
 
    public StackNode() {
        setValue(null);
        setNext(null);
    }
 
    public StackNode(Object o) {
        value = 0;
        next = null;
    }
 
    public StackNode(StackNode node) {
        value = node.getValue();
        next = node.getNext();
    }
 
    public Object getValue() {
        synchronized(locker){
            System.out.print(" Doing ");
            System.out.println(" get ");
            System.out.flush();
            return value;
        }
    }
 
    public void setValue(Object value) {
        synchronized(locker){
            System.out.print(" making ");
            System.out.println(" set ");
            System.out.flush();


            this.value = value;
        }
         
    }
 
    public StackNode getNext() {
        synchronized(locker){
            return next;
        }
    }
 
    public void setNext(StackNode next) {
        synchronized(locker){
            this.next = next;
        }
    }

}



TestStackNode.java

热点排行