死锁的实现
一个线程等待另一个线程执行完毕后才可以继续执行,但如果现在相关的线程彼此都在等待着,那么就会造成死锁。
一定要注意对资源的上锁不要成“环”。
避免死锁:
1.按照顺序加锁,但是这种方式必须要事先知道你所要用到的所有锁并且要对这些锁排序。不是很常用,因为一般无法预知。
2.加锁时限:在尝试获取锁的时候加一个超时时间,超过这个时间就放弃。但是Java中不能对synchronized同步块设置超时时间,需要创建一个自定义锁。
银行家算法是避免死锁的算法;
银行家算法
class Pen{
private String pen="笔";
public String getPen() {
return pen;
}
}
class Book{
private String book="本";
public String getBook() {
return book;
}
}
public class Thread5 {
private static Pen pen=new Pen();
private static Book book=new Book();
public static void main(String[] args) {
Thread5 thread5=new Thread5();
thread5.deadLock();
}
public void deadLock(){
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
synchronized (pen){
System.out.println("我有笔,没有本");
synchronized (book){
System.out.println("我有笔,也有本");
}
}
}
},"线程A");
Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
synchronized (book){
System.out.println("我有本,没有笔");
synchronized (pen){
System.out.println("我有本,也有笔");
}
}
}
},"线程B");
thread.start();
thread1.start();
}
}