哪些操作释放锁和不释放锁.死锁

哪些操作释放锁和不释放锁.死锁

释放锁的操作

(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,放人");
			}
			
		}
	}
}

发布了64 篇原创文章 · 获赞 15 · 访问量 2457

猜你喜欢

转载自blog.csdn.net/qq_40742223/article/details/104709221