迷茫的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是不会释放锁的。

posted on 2014-08-05 16:45  大盗杨君梅  阅读(379)  评论(0)    收藏  举报

导航