迷茫的syncronized(希望牛人给我解答)
学习syncronized就写了些方法,去测试,
public class SynchronizedTest2 extends Thread{
private int count;
public synchronized void test1(){
System.out.println("thread="+count);
count=20;
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread()+" "+count);
}
public synchronized void hh(){
System.out.println(count);
count=100;
try {
Thread.sleep(2500);//这是下面红线部分所提到的sleep
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread()+" 有锁有sleep "+count);
}
public void run(){
test1();
}
public static void main(String args[]){
SynchronizedTest2 thread=new SynchronizedTest2();
thread.start();
thread.hh();
}
}
结果输出为:
0
Thread[main,5,main] 有锁有sleep 100
thread=100
Thread[Thread-0,5,main] 20
测试二:于是更改hh方法,先去掉syncronized方法,测试结果为
0
thread=100
Thread[main,5,main] 无锁有sleep 20
Thread[Thread-0,5,main] 20
测试三:保留syncronized方法,无sleep结果为:
0
Thread[main,5,main] 有锁无sleep 100
thread=100
Thread[Thread-0,5,main] 20
测试四:去掉syncronized去掉sleep
0
Thread[main,5,main] 无锁无sleep 100
thread=100
Thread[Thread-0,5,main] 20
个人认为既没有syncronized也没有sleep,却输出了100,是因为main方法为主线程,获得最开始运行的权利,迅速运行完的结果。而无锁有sleep,则main线程在休息时,count被thread夺去了权利。
比较这四种结果,开始以为自己hh方法是因为锁住的缘故,可是当测试二,hh()方法没有了synchronized按理说test1()方法获得了锁,应该执行完毕才可以呢,可是为什么不是呢
请会的人给我回答,谢谢了
昨天阅读了一片文章,http://www.cnblogs.com/kayfans/archive/2012/06/18/2553564.html
觉得给我很大帮助。
上面说每一个类的对象都对应着一把锁,每个snchronized方法都必须获得这把锁,才能够有执行的机会。而sleep是不会释放锁的。
浙公网安备 33010602011771号