五、synchronized细节

复制代码
public class test {
    public static void main(String[] args) {
        Phone phone = new Phone();

        new Thread(() -> {
            phone.sendEmail();
        }).start();

        new Thread(() -> {
            phone.sendSms();
        }).start();

        new Thread(() -> {
            phone.sendHello();
        }).start();
    }
}

class Phone {
    public synchronized void sendEmail() {
        System.out.println("sendEmail。。。");
        try {
            System.out.println("暂停3秒钟");
            TimeUnit.SECONDS.sleep(3);
            System.out.println("暂停完成");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void sendSms() {
        System.out.println("sendSms。。。");
    }

    public void sendHello() {
        System.out.println("sendHello。。。");
    }
}
复制代码

输出

sendEmail。。。
暂停3秒钟
sendHello。。。
暂停完成
sendSms。。。

 说明:

1、一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法,其他的线程都只能等待。

2、synchronized锁的是当前对象this,被锁定后,其他线程都不能进入当前对象的其他的synchronized方法。

3、未加synchronized修饰的方法,不会有竞争关系,可以直接调用。

4、对于普通同步方法,synchronized锁的是当前实例对象,通常值this,所有的普通同步方法用的都是同一把锁——实例对象本身。

5、对于static静态同步方法,synchronized锁的是当前类的Class对象,如.class唯一的一个模板。

6、对于同步方法块,锁的是synchronized括号内的对象。

 

posted @   幻月hah  阅读(40)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
点击右上角即可分享
微信分享提示