死锁问题
(复制项目直接ctrl+c;ctrl+v)
█
同步弊端
☞ 影响效率
☞ 如果出现了嵌套锁,容易产生死锁
☞ 影响效率
☞ 如果出现了嵌套锁,容易产生死锁
█ 死锁问题及其代码
☞ 死锁是指两个以上的线程在执行过程中,因为争夺资源而产生的一种相互等待的现象
☞ 死锁是指两个以上的线程在执行过程中,因为争夺资源而产生的一种相互等待的现象
Main.java | MyLock.java |
package com.java.demo;
public class Main {
public static void main(String[] args) {
Object obj=new Object(); //这里的obj传到MyThread,这样两个线程共用同一个对象才能锁住
MyThread t1=new MyThread("中国人",obj);
MyThread t2=new MyThread("英国人",obj);
t1.start();
t2.start();
}
}
|
package com.java.demo;
public class MyLock {
static Object LockA=new Object();
static Object LockB=new Object();
}
|
MyThread.java | |
package com.java.demo;
public class MyThread extends Thread{
//Object obj;
public void run(){
super.run();
//目的让线程死锁
if(getName().equals("中国人")){
synchronized(MyLock.LockA){ //这里换种方式 ,不用obj
System.out.println(getName()+"MyThread.run() 我得到了A锁,要继续执行的话需要B锁");
synchronized(MyLock.LockB){
System.out.println(getName()+"MyThread.run() 我得到了B锁");
System.out.println(getName()+"MyThread.run() 我两把锁都得到了,开始工作");
}
}
}
else if(getName().equals("英国人")){
synchronized(MyLock.LockB){
System.out.println(getName()+"MyThread.run() 我得到了B锁,要继续执行的话需要A锁");
synchronized(MyLock.LockA){
System.out.println(getName()+"MyThread.run() 我得到了A锁");
System.out.println(getName()+"MyThread.run() 我两把锁都得到了,开始工作");
}
}
}
}
public MyThread(String name,Object obj){
super(name);
//this.obj=obj;
}
}
|