线程sleep不释放锁代码验证说明

关于sleep不释放锁的说明

1
2
3
4
5
6
7
8
public void run(){
while(true){
synchronized(this){
//todo sth
Thread.sleep()
}
}
}

上述代码执行会出现多个线程都能执行同步代码块情况,原因并非是sleep释放锁,而是每一次同步代码块执行完毕(循环一次完毕)线程会自动释放锁。流程图如下:

sleep1

一次循环开始—请求并获得锁—todo sth-当前线程休眠—同步代码块执行一次完毕,锁自动释放(一次循环结束,其它线程获得锁执行)-下一次循环

1
2
3
4
5
6
7
8
public void run(){
synchronized(this){
while(true){
//todo sth
Thread.sleep()
}
}
}

上述代码才能表明sleep并不会释放对象锁。流程图如下:

sleep2

请求获得锁—循环开始—todo sth—当前线程休眠(sleep也不能使线程释放锁,故别的线程无法执行)—一次循环结束,同步代码块未执行完毕—下一次循环

关键点:同步代码块执行完毕会自动释放其获得的锁。