准备工作

创建一个资源类Phone(手机), 里面两个方法sendEmail(发邮件), sendSMS(发短信), 都是线程同步方法

class Phone {public synchronized void sendSMS() {System.out.println("------sendSMS");}public synchronized void sendEmail() {System.out.println("------sendEmail");}
}

根据我们以下八种情况来进行调用

  1. 标准访问, 两个线程, 各自访问一个方法

    public class EightLocks {public static void main(String[] args) throws InterruptedException {Phone phone = new Phone();new Thread(()->{phone.sendSMS();}, "AA").start();Thread.sleep(100);new Thread(()->{phone.sendEmail();}, "BB").start();}
    }
    

    打印结果

    ------sendSMS
    ------sendEmail

  2. 在sendSMS方法中停留4秒, 其余与第一种情况一样

    public static synchronized void sendSMS() throws InterruptedException {//停留4秒TimeUnit.SECONDS.sleep(4);System.out.println("------sendSMS");
    }
    

    打印结果

    ------sendSMS
    ------sendEmail

    1-2情况说明:

    • 一个对象里面如果有多个synchronized方法, 某一个时刻内, 只要一个线程去调用其中的一个synchronized方法了, 其它的线程都只能等待, 换句话说,某一个时刻内, 只能有唯一的一个线程去访问这些synchronized方法
    • 锁的是当前对象this, 被锁定后, 其它的线程都不能进入到当前对象的其它的synchronized方法
  3. 新增普通方法hello(), 第一个线程调用sendSMS(), 第二个线程调用hello()

    //资源类中增加
    public void hello() {System.out.println("------getHello");
    }//主类中修改
    new Thread(()->{phone.hello();
    }, "BB").start();
    

    打印结果

    ------hello
    ------sendSMS

  4. 创建两个Phone实例, 一个调用sendSMS, 一个调用sendEmail

    public class EightLocks {public static void main(String[] args) throws InterruptedException {Phone phone1 = new Phone();Phone phone2 = new Phone();new Thread(()->{phone1.sendSMS();}, "AA").start();Thread.sleep(100);new Thread(()->{phone2.sendEmail();}, "BB").start();}
    }
    

    打印结果

    ------sendEmail

    ------sendSMS

    3-4情况说明:

    • 普通方法与锁无关, 不会被阻塞
    • 两个实例对象不是同一把锁
  5. 将sendSMS()和sendEmail()变成静态方法, 一个实例对象去调用

    class Phone {public static synchronized void sendSMS() {System.out.println("------sendSMS");}public static synchronized void sendEmail() {System.out.println("------sendEmail");}
    }public class EightLocks {public static void main(String[] args) throws InterruptedException {Phone phone = new Phone();new Thread(()->{phone.sendSMS();}, "AA").start();Thread.sleep(100);new Thread(()->{phone.sendEmail();}, "BB").start();}
    }
    

    打印结果

    ------sendSMS

    ------sendEmail

  6. 两个实例对象调用静态方法

    public class EightLocks {public static void main(String[] args) throws InterruptedException {Phone phone1 = new Phone();Phone phone2 = new Phone();new Thread(()->{phone1.sendSMS();}, "AA").start();Thread.sleep(100);new Thread(()->{phone2.sendEmail();}, "BB").start();}
    }
    

    打印结果

    ------sendSMS

    ------sendEmail

    5-6情况说明:

    • 对于普通方法来说, 锁的对象是this, 也就是当前实例对象
    • 对于静态方法来说, 锁的对象就是当前类的Class对象, 也就是说这个类的所有实例对象公用同一把锁
  7. 一个静态方法, 一个普通方法, 一个实例对象调用

    class Phone {public static synchronized void sendSMS() {System.out.println("------sendSMS");}public synchronized void sendEmail() {System.out.println("------sendEmail");}
    }public class EightLocks {public static void main(String[] args) throws InterruptedException {Phone phone = new Phone();new Thread(()->{phone.sendSMS();}, "AA").start();Thread.sleep(100);new Thread(()->{phone.sendEmail();}, "BB").start();}
    }
    

    打印结果

    ------sendEmail

    ------sendSMS

  8. 一个静态方法, 一个普通方法, 两个实例对象调用

    public class EightLocks {public static void main(String[] args) throws InterruptedException {Phone phone1 = new Phone();Phone phone2 = new Phone();new Thread(()->{phone1.sendSMS();}, "AA").start();Thread.sleep(100);new Thread(()->{phone2.sendEmail();}, "BB").start();}
    }
    

    打印结果

    ------sendEmail

    ------sendSMS

    7-8情况说明:

    • 不管是一个实例对象还是多个实例对象, 普通同步方法与静态同步方法的锁都不是同一把

我的个人主页: www.ayu.link
本文连接: ┏ (゜ω゜)=☞

JUC之锁的八种情况相关推荐

  1. MSN无法登陆的八种情况

    经常看到用户反映说MSN Messenger无法登录,碰到的一串数字的错误码.现列出以下几条常见的帮障,说不定你无法登陆MSN的原因就属于其中一种. 1.如果你的帐号和密码没有在MSN中保存,你需要确 ...

  2. 省略to的动词不定式八种情况

    省略to的动词不定式八种情况 一.感觉动词后省略to的情况 主语+ (四看see/watch/notice/look at,三使役let/make/have,两听listen to/hear, 一感觉 ...

  3. mysql事务怎么加排他锁_八种方法实现CSS页面底部固定 - SegmentFault 思否

    共享锁.排他锁 InnoDB 实现了两种类型的锁机制:共享锁(S)和排他锁(X).共享锁允许一个事务读数据,不允许修改数据,如果其他事务要再对该行加锁,只能加共享锁:排他锁是修改数据时加的锁,可以读取 ...

  4. 对象的notify方法的含义和对象锁释放的三种情况

    1,notify的含义     (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...

  5. Redis事务控制|相关命令|队列失败两种情况|官方解释无回滚|悲观锁和乐观锁简单介绍

    相关命令 命令队列执行失败的两种情况 1.执行队列时失败:错误在入队时检测不出来,整个队列执行时有错的命令执行失败,但是其他命令并没有回滚. 加入队列时失败:遇到了入队时即可检测到的错误,整个队列都不 ...

  6. 专家把脉,深入分析八种前景看好的物联网业务形态

    来源:通信世界全媒体 摘要:物联网将会为经济带来新动力,对社会带来新变革,它的业务形态也在发展变化.未来随着更多成熟的业务场景的出现,会演变出更多有前景的应用形态,也会带来更多的市场机会. 万物互联是 ...

  7. 八种架构设计模式及其优缺点概述

    1. 什么是架构 我想这个问题,十个人回答得有十一个答案,因为另外的那一个是大家妥协的结果.哈哈,我理解,架构就是 骨架 ,如下图所示: 人类的身体的支撑是主要由骨架来承担的,然后是其上的肌肉.神经. ...

  8. 对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)

    1.对象头 Java对象头里的Mark Word里默认存储对象的HashCode.分代年龄和锁标记位. 32位JVM的Mark Word的默认存储结构如下图所示: 在运行期间,Mark Word里存储 ...

  9. 深入分析八种前景看好的物联网业务形态

    深入分析八种前景看好的物联网业务形态 在万物互联已成为行业未来发展共识的情况下,为了更好地识别物联网不同业务形态发展前景,本文对目前存在的热点应用和未来预期较好的物联网典型业务形态的前景进行分析,以期 ...

最新文章

  1. sql like N'%%',N 是代表什么意思 及Like语句详解
  2. 【密码学02】密码系统原理及数学背景
  3. ITK:提取网格边界上的顶点
  4. DCMTK:函数dcmGenerateUniqueIdentifier的测试程序
  5. Yii的Where条件
  6. Java IO: File
  7. Tomcat配置自签名https
  8. 创建实现一个简单的web项目
  9. Android实现圆角照片和圆形照片
  10. 【Java】字符串交叉合并
  11. python输出24进制时间_python-如何在给定时间原点的情况下将日期时间从十进制转换为“%y-%m-%d%H:%M:%S”?...
  12. [转]OpenMP 入门指南
  13. 在ASP.NET应用程序中使用身份模拟(Impersonation)
  14. ToStringBuilder
  15. 微型计算机基础理论——微处理器工作概述
  16. vmix一块屏幕分成三块_定点爆破三块绊脚石,OLED电视或可星火燎原
  17. CSU1256(天朝的单行道)
  18. “Your Firefox profile cannot be loaded. It may be missing or inaccessible.“
  19. python 字符串结束符_python字符串以反斜杠结尾
  20. 【SCA-CNN 解读】空间与通道注意力:Spatial and Channel-wise Attention

热门文章

  1. 慕课网Java入门第一季教程(六)数组
  2. 联通物联卡流量查询、充值的操作方法
  3. 社团计算机教室申请,社团申请书4篇
  4. 小批量制造企业生产计划
  5. 绘制简单封闭图形并且进行填充
  6. HSL:色相,饱和度,亮度
  7. 淘宝搜索排名优化小技巧总结,不会的赶快来看看
  8. 洛谷P2265 路边的水沟
  9. 转:程序员必读书单 1.0
  10. 【CSS】你真的了解font-weight吗?