当我们使用锁同步代码的时候,会在什么时候释放锁呢
1.当前线程的同步方法、代码块执行结束的时候释放。
2.当前线程在同步方法、同步代码块中遇到break 、 return 终于该代码块或者方法的时候释放。
3.出现未处理的error或者exception导致异常结束的时候释放。
4.程序执行了 同步对象 wait 方法 ,当前线程暂停,释放锁
在以下两种情况不会释放锁
1. 代码块中使用了 Thread.sleep() Thread.yield() 这些方法暂停线程的执行,不会释放。
2. 线程执行同步代码块时,其他线程调用 suspend 方法将该线程挂起,该线程不会释放锁 ,所以我们应该避免使用 suspend 和 resume 来控制线程 。
tips
1. 对于一个已经竞争到同步锁的线程,在还没有走出同步块的时候,即使时间片结束也不会释放锁。
2. 对象锁和类锁是两个不同的锁。在同一个类的静态方法和实例方法上都加synchronized关键字,这时静态方法的synchronized对应的是 **类锁**,实例方法的synchronized是**对象锁**。这是两个不同的锁。 实例对象调用**类锁**方法也会同步。
volatile关键字的使用
1. 关键字volatile的主要作用是使变量在多个线程间可见。
2. 关键字volatile的作用是强制用公共堆栈中取的变量的值,而不是从线程私有的数据栈中取得变量的值。
网友评论