死锁概念:两个线程都占据对方运行必须获取的资源,由不想释放出来,导致最后两个线程都占着一半的线程呆着。(就像获得“倚天剑‘和’屠龙刀‘“就可以称霸武林,结果拥有倚天剑的一方和拥有屠龙刀的一方都不肯交给对方,又不能抢,,最后啥都,没有发生,还是让他们各自占着宝物!!)多个线程一样适用该理论。
package com.heal.Thread_test.syn;
public class deadLock {
public static void main(String[] args) {
Makeup g1=new Makeup(0,"灰姑凉");
Makeup g2=new Makeup(1,"白雪公主");
g1.start();
g2.start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
class Makeup extends Thread{
//需要的资源只有一份,所以用Static来保证只有一份
static Lipstick lipstick=new Lipstick();
static Mirror mirror=new Mirror();
int choice;//选择
String girlName;//使用化妆品的人
// MakeUp的构造方法
Makeup(int choice,String girlName){
this.choice=choice;
this.girlName=girlName;
}
@Override
public void run(){
//化妆
try{
makeup();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void makeup() throws InterruptedException{
if(choice==0){
synchronized (lipstick){//获得口红的锁
System.out.println(this.girlName+"获得口红的锁");
Thread.sleep(1000);
}
synchronized (mirror){//一秒后想获得镜子
System.out.println(this.girlName+"获得镜子的锁");
}
}else {
synchronized (mirror){//获得镜子的锁
System.out.println(this.girlName+"获得镜子的锁");
Thread.sleep(2000);
}
synchronized (lipstick){//两秒后获得口红
System.out.println(this.girlName+"获得口红的锁");
}
}
}
}
死锁的避免方法 产生死锁的四个必要条件
1. 互斥条件:一个资源每次只能被一个进程使用。
2. 请求与保持条件:一个进程因请求资源而阻塞时,对已经获得的资源保持不放。
3. 不剥夺条件:进程以获得的资源,再未使用完之前,不能强行剥夺。
4. 循环等待条件:若干进程之间形成一种头尾像接循环等待资源关系。
为了避免死锁我们可以这4个条件的一个或者是多个进行破坏。
lock锁
package com.heal.Thread_test.syn;
import java.util.concurrent.locks.ReentrantLock;
public class gaojiLock{
public static void main(String[] args) {
TestLock testLock=new TestLock();
new Thread(testLock).start();
new Thread(testLock).start();
new Thread(testLock).start();
}
}
class TestLock implements Runnable{
int ticksNums=10;
//定义lock锁
private final ReentrantLock lock=new ReentrantLock();
@Override
public void run() {
while (true){
try {
lock.lock();//加锁的方法
if (ticksNums>0){
try{
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(ticksNums--);
}else {
break;
}
} finally {
lock.unlock();//解锁
}
}
}
}