线程同步

什么是线程同步?也是并发问题

    同一个对象被多个线程同时操作。

 

死锁

//死锁:多个线程互相抱着对方需要的资源,然后形成僵持
public class DeadLock {
    public static void main(String[] args) {
        MakeUp m1 = new MakeUp(0,"小红");
        MakeUp m2 = new MakeUp(1,"小蓝");

        m1.start();
        m2.start();
    }

}
//口红
class Lipstick{
}
//镜子
class Mirror{
}
class MakeUp extends Thread{
    //需要的资源只有一份,用static来保证只有一份
    static Lipstick lipstick =new Lipstick();
    static  Mirror mirror =new Mirror();

    int choose; //选择
    String name;    //使用化妆的人

    MakeUp(int choose,String name){
        this.choose =choose;
        this.name =name;
    }

    @Override
    public  void run(){
        //化妆
        try {
            make(choose,name);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public  void  make(int choose,String name) throws InterruptedException {
        if (choose==0){//选择口红
            synchronized (lipstick){
                System.out.println(name+"选择了口红");
                Thread.sleep(1000);
                synchronized (mirror){
                    System.out.println(name+"选择了镜子");
                }
            }
        }else{
            synchronized (mirror){
                System.out.println(name+"选择了镜子");
                Thread.sleep(1000);
                synchronized (lipstick){
                    System.out.println(name+"选择了口红");
                }
            }
        }
    }
}

解决:只要不要抱着对方的锁就可以了,把对方需要的资源释放

public  void  make(int choose,String name) throws InterruptedException {
        if (choose==0){//选择口红
            synchronized (lipstick){
                System.out.println(name+"选择了口红");
                Thread.sleep(1000);
//                synchronized (mirror){
//                    System.out.println(name+"选择了镜子");
//                }
            }
            synchronized (mirror){
                System.out.println(name+"选择了镜子");
            }
        }else{
            synchronized (mirror){
                System.out.println(name+"选择了镜子");
                Thread.sleep(1000);
//                synchronized (lipstick){
//                    System.out.println(name+"选择了口红");
//                }
            }
            synchronized (lipstick){
                System.out.println(name+"选择了口红");
            }
        }
    }

 

posted @ 2022-05-23 18:21  不想当将军的好士兵  阅读(21)  评论(0)    收藏  举报