5. 八锁问题

class Phone{
    public static synchronized void sendEmail() throws Exception{
        //暂停一会儿线程
        try{
            TimeUnit.SECONDS.sleep(4);}catch (InterruptedException e){e.printStackTrace();}
        System.out.println("-------sendEmail");
    }

    public static synchronized void sendSMS() throws Exception{
        System.out.println("-------sendSMS");
    }

    public void hello(){
        System.out.println("--------hello");
    }
}

/**
 * 题目:多线程8锁
 * 1 标准访问(邮件没sleep),打印邮件还是短信  邮件
 * 2 邮件方法暂停4秒,先打印邮件还是短信? 邮件
 * 以下邮件都sleep
 * 3 新增普通方法hello,先打印邮件还是hello?  hello
 * 4 两部手机,先打印邮件(phone1)还是短信(phone2)? 短信
 * 5 两个静态同步方法,同一部手机,先打印邮件还是短信?邮件
 * 6 两个静态同步方法,2部手机,先打印邮件还是短信?  邮件
 * 7 1个普通同步方法,1个静态同步方法,同一部手机,先打印邮件还是短信?  短信
 * 8 1个普通同步方法,1个静态同步方法,2部手机,先打印邮件还是短信? 短信
 *
 * 1 2 锁解释
 * 一个对象里如果有多个synchronized方法,某一时刻内,只要有一个线程去调用synchronized方法,其他
 * 线程只能等待,换句话说,某一时刻只能有一个线程去访问这些synchronized方法。
 * 锁是当前对象this,被锁定后,其他线程都不能进入到当前对象的其他的synchronized方法中
 *
 * 3 锁解释
 * 普通方法和同步锁无关,两个同步锁相当于手机的不同功能,普通方法相当于手机壳
 *
 * 4 锁解释
 * 两个对象,不是同一把锁,互不相干
 *
 * 5 6 锁解释
 * 换成静态同步方法后,锁变成了"Object对象"->Phone.class,而不是当前对象this
 *
 * 7 8 锁解释
 * 一个拿的是Phone.class锁,一个是this锁,不一样,和是不是同一部手机没有关系
 *
 */

public class Lock8 {
    public static void main(String[] args) {
        Phone phone=new Phone();
        Phone phone2=new Phone();
        new Thread(()->{
            try {
                phone.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"A").start();

        new Thread(()->{
            try {
                phone2.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"B").start();
    }
}
截屏2020-05-11下午9.02.35.png
截屏2020-05-11下午9.02.57.png

你可能感兴趣的:(5. 八锁问题)