synchronized 修饰代码块的时候获得多个线程对象的锁的时候就会造成线程死锁的情况出现 示例如下:
public class Deadlock {
public static void main(String[] args) {
//多线程中的死锁问题 如果某一个代码块 同时拥有两个对象的锁 就有可能会发生死锁的情况
//多个线程互相抱着对方所需要的资源 然后形成了僵持
Makeup makeup1=new Makeup(0,"小红");
Makeup makeup2=new Makeup(1,"小明");
makeup1.start();
makeup2.start();
}
}
class Lipstick{
}
class Mirrors{
}
class Makeup extends Thread {
//限制资源的数量 让多个线程互相抢夺仅有的一份资源
static Lipstick lipstick=new Lipstick();
static Mirrors mirrors=new Mirrors();
int choice ; //选择
String girlName;//使用化妆品的人
//构造方法
Makeup(int choice ,String girlName){
this.choice=choice;
this.girlName=girlName;
}
@Override
public void run() {
//线程的执行执行的是 重写的run()方法 所以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 (mirrors){
System.out.println(this.girlName+"获得镜子的锁");
}
}
}else {
synchronized (mirrors) { //获得口红的锁
System.out.println(this.girlName + "获得镜子的锁");
Thread.sleep(1000);
synchronized (lipstick) {
System.out.println(this.girlName + "获得口红的锁");
}
}
}
}}
这个时候只要将不同的synchronized 不写在一个代码块中就可以避免死锁的出现
}
private void makeup() throws InterruptedException{
if (choice==0){
synchronized (lipstick){ //获得口红的锁
System.out.println(this.girlName+"获得口红的锁");
Thread.sleep(1000);
}
synchronized (mirrors){
System.out.println(this.girlName+"获得镜子的锁");
}
}else {
synchronized (mirrors) { //获得口红的锁
System.out.println(this.girlName + "获得镜子的锁");
Thread.sleep(1000);
}
synchronized (lipstick) {
System.out.println(this.girlName + "获得口红的锁");
}
//产生死锁的四个必要条件
只要避免任何一个条件就可以实现避免死锁的情况。



