JAVA多线程-锁

多线程锁

死锁

  • 多个线程在竞争同一个资源形成的阻塞效果
  • 互相抱有对象所需要的资源才能够运行
public class Demo {
    public static void main(String[] args) {
        Preemption preemption = new Preemption(0,"张三");
        Preemption preemption1 = new Preemption(1,"李四");
        preemption.start();
        preemption1.start();
    }


}
class Rob{//玩具抢类

}
class Superman{//玩具超人类

}

class Preemption extends Thread{
   static Rob rob = new Rob();
   static Superman superman = new Superman();
    int choice;//选择
    String setName;

    public Preemption(int choice, String setName) {
        this.choice = choice;
        this.setName = setName;
    }

    @Override
    public void run() {
        try {
            Pk();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private void Pk() throws InterruptedException {
        if (choice == 0){
            synchronized (rob){
                System.out.println(this.setName+"获得玩具抢");
                Thread.sleep(1000);
                synchronized (superman){
                    System.out.println(this.setName+"获取了玩具超人");
                }
            }
        }else {
            synchronized (superman){
                System.out.println(this.setName+"获得玩具抢");
                Thread.sleep(2000);
                synchronized (rob){
                    System.out.println(this.setName+"获取了玩具超人");
                }
            }

        }
    }
}

JAVA多线程-锁_第1张图片

Lock锁

JAVA多线程-锁_第2张图片

//没加锁前
public class Demo {

    public static void main(String[] args) {
        TestLock testLock = new TestLock();
        new Thread(testLock).start();
        new Thread(testLock).start();
        new Thread(testLock).start();

    }



}
class TestLock implements Runnable{//多线程对象


    int ticketName = 10;//定义的票名





    @Override
    public void run() {

        while (true){


                if (ticketName>0){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticketName--);
                }else {
                    break;
                }


        }

    }
}
public class Demo {

    public static void main(String[] args) {
        TestLock testLock = new TestLock();
        new Thread(testLock).start();
        new Thread(testLock).start();
        new Thread(testLock).start();

    }



}
class TestLock implements Runnable{//多线程对象


    int ticketName = 10;//定义的票名

    //定义lock锁ReentrantLock可重复锁
    private ReentrantLock lock = new ReentrantLock();



    @Override
    public void run() {

        while (true){
            try {
                lock.lock();//加锁
                if (ticketName>0){
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(ticketName--);
                }else {
                    break;
                }
            }finally {
                //解锁
                lock.unlock();

            }


        }

    }
}

JAVA多线程-锁_第3张图片

你可能感兴趣的:(多线程,java,jvm,spring)