一:线程概念:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃 自己需要的同步 资源,就形成了线程的死锁. 出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于 阻塞状态,无法继续。
synchronized:隐试加锁,释放锁,可以锁定代码块,也可以锁定方法。
lock:可以显示的加锁,只能锁定代码块
package day05.demo2;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Dielock extends Thread{
static Object objA = new Object();
static Object objB = new Object();
boolean flag;
public Dielock(boolean flag) {
this.flag = flag;
}
@Override
public void run() {
if(flag){
synchronized (objA) {
System.out.println("ifobjA");
synchronized (objB){
System.out.println("ifobjB");
}
}
}else{
synchronized (objB){
System.out.println("elseobjB");
synchronized (objA){
System.out.println("elseobjA");
}
}
}
}
}
package day05.demo2;
public class Test {
public static void main(String[] args) {
Dielock dielock1 = new Dielock(true);
Dielock dielock2 = new Dielock(false);
dielock1.start();
dielock2.start();
}
}
运行结果如下:
表明已经发生死锁
二线程通讯:指的是多个线程通过消息传递实现相互牵制,相互调度,即线程间的相
互作用。
涉及三个方法:wait(), notify(),notifyAll(),
wait一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器。
.notify一旦执行此方法,就会唤醒被wait的一个线程。如果有多个线程被wait,
就唤醒优先级高的那个。 .notifyAll一旦执行此方法,就会唤醒所有被wait的线程。wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方
法中。