双方抱着对方需要的资源,双方僵持。
死锁
package Lock;
public class DeadLock {
public static void main(String[] arg) {
MakeUp g1 = new MakeUp(0,"gemini");
MakeUp g2 = new MakeUp(1,"no_fear");
g1.start();
g2.start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class MakeUp extends Thread{
//需要的资源只有一份
static Lipstick lipstick = new Lipstick();
static Mirror mirror = new Mirror();
int choise;
String girlName;
MakeUp(int choise,String girlName){
this.choise = choise;
this.girlName = girlName;
}
public void run(){
//化妆
makeup();
}
private void makeup() {
if(choise ==0) {
synchronized (lipstick) {
System.out.println(this.girlName+"获得口红");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (mirror) {
System.out.println(this.girlName+"获得镜子");
}
}
}
else synchronized (mirror) {
System.out.println(this.girlName+"获得镜子");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (lipstick) {
System.out.println(this.girlName+"获得口红");
}
}
}
}
改法:
Lock(锁)
可重入锁
import java.util.concurrent.locks.ReentrantLock;
public class TestLock {
public static void main(String[] args) {
TestLock2 testlock2 = new TestLock2();
new Thread(testlock2).start();
new Thread(testlock2).start();
new Thread(testlock2).start();
}
}
class TestLock2 implements Runnable {
int ticketNum = 10;
private final ReentrantLock lock = new ReentrantLock();
public void run() {
while(true) {
try {
lock.lock();
if(ticketNum >0) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(ticketNum--);
}else {
break;
}
}finally {
lock.unlock();
}
}
}
}