juc----举例说明8锁问题

class Phone {

    public static synchronized void SendSMS() throws InterruptedException {
        TimeUnit.SECONDS.sleep(4);
        System.out.println("发了短信");
    }

    public   synchronized void SendMail(){
        System.out.println("发了邮件");
    }

    public void OpenPhone(){
        System.out.println("开机");
    }


}
//1.主线程在new 发短信后睡眠100毫秒,发短信、发邮件的打印顺序
//2.发短信线程中执行时睡眠4秒,发短信、发邮件的打印顺序
//3.开机线程,发短信、开机的打印顺序
//4.两部手机,先短信还是先邮件
//5.2个同步方法变静态,一部手机,先短信还是先邮件
//6.2个同步方法变静态,2部手机,先短信还是先邮件
//7.一个静态同步方法,一个普通同步方法,一手机,先短信还是先邮件
//8.一个静态同步方法,一个普通同步方法,2手机,先短信还是先邮件

/**
 * 1和2说明:synchronized方法锁的是当前对象。多个同步方法被调用只能等待先被调用的同步方法释放锁之后才能继续执行
 * 2和3说明:普通方法不参与锁的竞争
 * 4说明:不同对象的同步方法调用,不竞争(非同一把锁)
 * 5、6说明:同步方法被静态关键字修饰时,对象锁变成了class字节码的锁,只要是这一个字节码的实例对象,
 * 不管是几个对象,全部参与竞争锁。
 *7说明:一个实例的非静态同步方法和静态同步方法获得的是不同的锁,不产生竞争,
 * 8说明:一个实例的非静态同步方法获得锁之后,本实例的其他非静态同步方法必须等待,
 * 但是其他实例的非静态同步方法与他不是同一把锁,所有没有竞争条件,不必等待获取锁。
 */
public class Lock_8 {
    public static void main(String[] args) throws InterruptedException {
        Phone phone = new Phone();
        Phone phone2 = new Phone();

        new Thread(() ->{
            try {
                phone.SendSMS();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"A").start();

        Thread.sleep(100);

        new Thread(() ->{
            try {
                phone.SendMail();
               // phone.OpenPhone();
               // phone2.SendMail();
            }catch (Exception e){
                e.printStackTrace();
            }

        },"B").start();
    }
}

你可能感兴趣的:(juc)