多线程synchronized 8种锁的状态

/**

1.标准访问,先打印短信还是邮件?
------sendSMS
------sendEmail

2.停4秒在短信方法内,先打印短信还是邮件?
------sendSMS
------sendEmail


3.新增普通的hello方法,是先打印短信还是hello?
----getHello
------sendSMS

4.现在有两部手机,先打印短信还是邮件?
------sendEmail
------sendSMS

5.两个静态同步方法,1部手机,先打印短信还是邮件?
------sendSMS
------sendEmail

6.两个静态同步方法,2部手机,先打印短信还是邮件?
------sendSMS
------sendEmail

7.1个静态同步方法,1个普通同步方法,1部手机,先打印短信还是邮件?
------sendEmail
------sendSMS

8.1个静态同步方法,1个普通同步方法,2部手机,先打印短信还是邮件?
------sendEmail
------sendSMS

*/

代码如下:
class Phone {
    public static synchronized void sendSMS() throws Exception {
        //停留4秒
        TimeUnit.SECONDS.sleep(4);
        System.out.println("------sendSMS");
    }

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

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


public class Lock_8 {

    public static void main(String[] args) throws InterruptedException {
        Phone phone1 = new Phone();
        Phone phone2 = new Phone();

        new Thread(() -> {
            try {
                phone1.sendSMS();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"AA").start();

        Thread.sleep(1);

        new Thread(() -> {
            try {
               //phone1.sendEmail();
              //  phone1.getHello();
                phone2.sendEmail();
            } catch (Exception e) {
                e.printStackTrace();
            }
        },"BB").start();
    }
}

 

总结:

synchronized实现同步的基础: Java中的每一个对象都可以作为锁,具体表现为以下3种形式:

1. 对于普通同步方法,锁是当前实例对象。
2. 对于静态同步方法,锁是当前类的Class对象。
3. 对于同步方法块,锁是Synchronized括号里配置的对象。

 

上一篇:JAVA匿名对象


下一篇:[Typescript] Dynamic types: Use TypeScript's Mapped Types and Template Literal Types Together