关于sleep不释放锁的说明
1 | public void run(){ |
上述代码执行会出现多个线程都能执行同步代码块情况,原因并非是sleep释放锁,而是每一次同步代码块执行完毕(循环一次完毕)线程会自动释放锁。流程图如下:
一次循环开始—请求并获得锁—todo sth-当前线程休眠—同步代码块执行一次完毕,锁自动释放(一次循环结束,其它线程获得锁执行)-下一次循环
1 | public void run(){ |
上述代码才能表明sleep并不会释放对象锁。流程图如下:
请求获得锁—循环开始—todo sth—当前线程休眠(sleep也不能使线程释放锁,故别的线程无法执行)—一次循环结束,同步代码块未执行完毕—下一次循环
关键点:同步代码块执行完毕会自动释放其获得的锁。