• 多线程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括号里配置的对象。
  • 相关阅读:
    将 Rust 代码转换成 HIR 和 MIR
    如何在linux下手动构建PHP项目运行环境(lnmrp)
    关于硬件相关技术知识
    macOS 应用程序损坏或来自不明的开发者,如何处理?
    SpringBoot 单元测试不执行:mavensurefireplugin 版本问题
    [转载] 深度解读:政事堂最近常提的“货币政策”
    Pod修改deployment实例数后未生效
    Pod日志输出:“Unable to retrieve container logs for docker://$容器id
    py手部追踪
    py的一些知识点
  • 原文地址:https://www.cnblogs.com/liuyi13535496566/p/15023167.html
Copyright © 2020-2023  润新知