• JUC-8锁问题


    1-2 锁

    /**
     * 8锁问题,就是关于锁的8个问题!,判断锁的是谁
     */
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 1.标志情况下,两个线程先打印,发短信? 打电话?
     * 2.sendSms延迟4秒,两个线程先打印,发短信? 打电话?
     */
    public class Lock_1To2 {
        public static void main(String[] args) throws InterruptedException {
            Phone phone = new Phone();
    
            //发短信
            new Thread(()->{
                try {
                    phone.sendSms();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"发短信").start();
    
            //延时
            TimeUnit.SECONDS.sleep(1);
    
            //打电话
            new Thread(()->{
                phone.call();
            },"打电话").start();
        }
    }
    
    class Phone{
    
        //synchronized 锁的对象是方法的调用者
        //两个方法使用的是同一个锁,哪个先拿到哪个先执行
        public synchronized void sendSms() throws InterruptedException {
            TimeUnit.SECONDS.sleep(4);
            System.out.println("发短信");
        }
    
        public synchronized void call(){
            System.out.println("打电话");
        }
    }
    
    

    synchronized 锁的对象是方法的调用者
    两个方法使用的是同一个锁,哪个先拿到哪个先执行

    3-4锁

    
    /**
     * 8锁问题,就是关于锁的8个问题!,判断锁的是谁
     */
    
    import java.util.concurrent.TimeUnit;
    
    /**
     * 3.静态方法,普通方法  打电话?发短信?
     * 4.不同对象         打电话?发短信?
     */
    public class Lock_3To4 {
        public static void main(String[] args) throws InterruptedException {
            Phone2 phone2 = new Phone2();
            Phone2 phone3 = new Phone2();
    
            //发短信
            new Thread(()->{
                try {
                    phone2.sendSms();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"发短信").start();
    
            //延时
            TimeUnit.SECONDS.sleep(1);
    
            //打电话
            new Thread(()->{
                phone3.call();
            },"打电话").start();
    
        }
    }
    
    class Phone2{
    
        //synchronized 锁的对象是方法的调用者
        //两个方法使用的是同一个锁,哪个先拿到哪个先执行
        public synchronized void sendSms() throws InterruptedException {
            TimeUnit.SECONDS.sleep(4);
            System.out.println("发短信");
        }
    
        public synchronized void call(){
            System.out.println("打电话");
        }
    
        //不是同步方法,不受锁的影响
        public void hello(){
            System.out.println("hello");
        }
    }
    

    5-6锁

    /**
     * 8锁问题,就是关于锁的8个问题!,判断锁的是谁
     */
    import java.util.concurrent.TimeUnit;
    /**
     * 5.静态同步方法,同一对象,发短信? 打电话?
     * 6.静态同步方法,不同对象,两个线程先打印,发短信? 打电话?
     */
    public class Lock_5To6 {
        public static void main(String[] args) throws InterruptedException {
            Phone3 phone1 = new Phone3();
            Phone3 phone2 = new Phone3();
            //发短信
            new Thread(()->{
                try {
                    phone1.sendSms();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"发短信").start();
    
            //延时
            TimeUnit.SECONDS.sleep(1);
    
            //打电话
            new Thread(()->{
                phone2.call();
            },"打电话").start();
    
        }
    }
    
    class Phone3{
    
        //static 类一加载就有了!锁的是Class,模版
        //synchronized 锁的对象是方法的调用者
        //两个方法使用的是同一个锁,哪个先拿到哪个先执行
        public static synchronized void sendSms() throws InterruptedException {
            TimeUnit.SECONDS.sleep(4);
            System.out.println("发短信");
        }
    
        public static synchronized void call(){
            System.out.println("打电话");
        }
    
    }
    

    7-8锁

    /**
     * 7.静态同步方法和同步方法 ,同一对象  发短信?打电话?
     * 8.静态同步方法和同步方法 ,不同对象  发短信?打电话?
     */
    
    import java.util.concurrent.TimeUnit;
    
    
    public class Lock_7To8 {
        public static void main(String[] args) throws InterruptedException {
            Phone4 phone1 = new Phone4();
           // Phone4 phone2 = new Phone4();
    
            //发短信
            new Thread(()->{
                try {
                    phone1.sendSms();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            },"发短信").start();
    
            //延时
            TimeUnit.SECONDS.sleep(1);
    
            //打电话
            new Thread(()->{
                phone1.call();
            },"打电话").start();
    
        }
    }
    
    class Phone4{
    
        //synchronized 锁的对象是方法的调用者
        //两个方法使用的是同一个锁,哪个先拿到哪个先执行
        public static synchronized void sendSms() throws InterruptedException {
            TimeUnit.SECONDS.sleep(4);
            System.out.println("发短信");
        }
    
        public synchronized void call(){
            System.out.println("打电话");
        }
    }
    

  • 相关阅读:
    1009 Product of Polynomials (25分)
    VS code 调试C++
    1065 A+B and C (64bit) (20分)
    UML与数据库应用系统
    语句(switch,异常,NDEBUG,assert)
    1046 Shortest Distance (20分)
    1042 Shuffling Machine (20分)
    模块和包
    闭包&装饰器
    迭代器、生成器
  • 原文地址:https://www.cnblogs.com/sinlearn/p/14681700.html
Copyright © 2020-2023  润新知