Java -- 互斥锁--死锁--释放锁
目录
1. 互斥锁
1. 基本介绍:
2. 注意事项和细节
2. 死锁
3. 释放锁
1. 互斥锁
1. 基本介绍:
1.1java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性
1.2 每个对象都引入了一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象
1.3 关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问
1.4 同步的局限性:导致程序的执行效率降低
1.5 同步方法的锁(非静态)可以是this,也可以是其他对象(要求是同一个对象)
1.6 同步方法(静态)的锁为这个类本身
2. 注意事项和细节
1. 同步方法如果没有使用static修饰:默认锁对象为this
2. 如果方法使用static修饰,默认锁对象:当前类.class
3. 选择同步代码块或同步方法,要求多个线程的锁对象是同一个即可!!
2. 死锁
多个线程占用了对方的锁资源,但不肯相让,导致了死锁,在编程是一定要避免死锁的发生
3. 释放锁
1. 当前线程的同步方法,同步代码块执行结束
2. 当前线程在同步代码块,同步方法中遇到break,return
3. 当前线程在同步代码块,同步方法中出现了未处理的Error或Exception,导致异常结束
4. 当前线程在同步代码块,同步方法中执行了线程对象的wait方法,当前线程暂停,并释放锁
下面的操作不会释放锁:
1. 线程执行同步代码块或同步方法时,程序调用Thread.sleep(),Thread.yield()方法暂停当前线程的执行,不会释放锁
2. 线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁
注意:尽量避免使用syspend 和 resume 来控制线程,方法不推荐使用