哪些操作释放锁和不释放锁.死锁
释放锁的操作
(1)当前线程的同步方法.同步代码块执行结束
(2)当前线程在同步代码块.同步方法中遇到了break,return终止了同步代码块.同步方法的执行.
(3)当前线程在同步代码块.同步方法中出现了未处理的Error或者Exception,导致当前线程异常结束
(4)当前线程在同步代码块.同步方法中执行了锁对象的wait()方法,当前线程被挂起,并释放锁
不会释放锁的操作
(1)线程执行同步代码块或同步方法时,程序调用Thread.sleep().Thread.yield()方法暂停当前线程的执行.
sleep和wait方法的区别
(1)sleep不会释放锁,wait方***释放锁
(2)sleep是Thread类,Thread.sleep(xx)
wait是Object类声明的,同步锁/监视器调用
死锁
什么是死锁
当两个线程互相持有对方想要的锁,而进入循环等待.
尽量避免嵌套的代码块,这样能有效防止死锁
一个产生死锁的代码
/** * */
package per.leiyustudy.thread.safe;
/** * @author 雷雨 * * 测试死锁 * * 尽量避免嵌套的代码块,这样能有效防止死锁 * */
public class TestDeadLock {
public static void main(String[] args) {
Object girl = new Object();
Object money = new Object();
Boy b = new Boy(girl,money);
Takes a = new Takes(girl, money);
b.start();
a.start();
}
}
class Boy extends Thread{
private Object girl;
private Object money;
public Boy(Object girl,Object money){
super();
this.girl=girl;
this.money=money;
}
public void run() {
synchronized (money) {
System.out.println("放了她,我给你500w");
synchronized (girl) {
System.out.println("得到了女朋友");
}
}
}
}
class Takes extends Thread{
private Object girl;
private Object money;
public Takes(Object girl,Object money){
super();
this.girl=girl;
this.money=money;
}
public void run() {
synchronized (girl) {
System.out.println("给我500w,我放了她");
synchronized (money) {
System.out.println("得到500w,放人");
}
}
}
}