死锁
死锁:过多的同步可能造成互相不释放资源,从而相互等待,一般发生与同步中持有多个对象的锁
避免:不要在同一个代码块中,同时持有多个对象的锁
/**
* 死锁:过多的同步可能造成互相不释放资源,从而相互等待,一般发生与同步中持有多个对象的锁
*避免:不要在同一个代码块中,同时持有多个对象的锁
* @author Administrator
*
*/
public class DeadLock {
public static void main(String[] args) {
new Thread(new Makeup(1, "止兮")).start();
new Thread(new Makeup(0, "小兮")).start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class Makeup extends Thread{
static Lipstick lipstick=new Lipstick();
static Mirror mirror=new Mirror();
//选择 0:先拿口红再拿镜子 其他数字:先拿镜子再拿口红
int choice;
//名字
String girl;
public Makeup(int choice, String girl) {
this.choice = choice;
this.girl = girl;
}
@Override
public void run() {
//化妆
makeup();
}
//相互持有对方的对象锁--》可能造成死锁
private void makeup() {
if(choice==0) {
synchronized (lipstick) {//获得口红的锁
System.out.println(this.girl+"涂口红");
//1秒后想拥有镜子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(mirror) {
System.out.println(this.girl+"照镜子");
}
}
}else {
synchronized (mirror) { //获得镜子的锁
System.out.println(this.girl+"照镜子");
//2秒后想拥有口红的锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized (lipstick) {
System.out.println(this.girl+"涂口红");
}
}
}
}
}
避免死锁
/**
* 死锁:过多的同步可能造成互相不释放资源,从而相互等待,一般发生与同步中持有多个对象的锁
*避免:不要在同一个代码块中,同时持有多个对象的锁
* @author Administrator
*
*/
public class DeadLock {
public static void main(String[] args) {
new Thread(new Makeup(1, "止兮")).start();
new Thread(new Makeup(0, "小兮")).start();
}
}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
//化妆
class Makeup extends Thread{
static Lipstick lipstick=new Lipstick();
static Mirror mirror=new Mirror();
//选择 0:先拿口红再拿镜子 其他数字:先拿镜子再拿口红
int choice;
//名字
String girl;
public Makeup(int choice, String girl) {
this.choice = choice;
this.girl = girl;
}
@Override
public void run() {
//化妆
makeup();
}
//相互持有对方的对象锁--》可能造成死锁
private void makeup() {
if(choice==0) {
synchronized (lipstick) {//获得口红的锁
System.out.println(this.girl+"涂口红");
//1秒后想拥有镜子的锁
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// synchronized(mirror) {
// System.out.println(this.girl+"照镜子");
// }
}
synchronized(mirror) {
System.out.println(this.girl+"照镜子");
}
}else {
synchronized (mirror) { //获得镜子的锁
System.out.println(this.girl+"照镜子");
//2秒后想拥有口红的锁
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// synchronized (lipstick) {
// System.out.println(this.girl+"涂口红");
// }
}
synchronized (lipstick) {
System.out.println(this.girl+"涂口红");
}
}
}
}