首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Java | 关于synchronized相关理解

Java | 关于synchronized相关理解

作者头像
Petterp
发布于 2022-02-09 14:25:32
发布于 2022-02-09 14:25:32
3520
举报
文章被收录于专栏:JetPackJetPack

背景

资源冲突

Java本身是支持多线程的,而在多线程的情况下,为了防止 多个任务同时访问同一个资源而导致的冲突问题,所以出现了加锁机制。也就是说第一个访问某项资源的任务必须锁定这项资源,使其他任务在其被解锁之前,就无法访问它,而在其被解锁时候,另一个任务就可以锁定并使用它。

所以Java提供了关键字 synchronized ,为防止资源冲突。当任务希望执行被synchronized 关键字保护的代码片段时,Java 编译器会生成代码已查看锁是否可用。如果可用,该任务获取锁,执行代码,然后释放锁。

对象锁&&方法锁

所有对象都自动包含 独立的锁 ,当调用对象上任何 synchronized 方法,此对象将被加锁,并且该对象上的其他 synchronized 方法调用只有等到前一个方法执行完成并释放了锁之后才能被调用。

对于 方法锁 ,其实和对象锁差别不大,方法锁针对的是一个方法,而对象锁则是针对于某一个对象的实例,从而锁定的是对应的一个代码块。

修饰多个方法

结论: 线程按序执行

修饰多个代码块

结论: 按调用顺序依次执行

修饰一个方法,另一个不修饰

结论: 线程交替执行

修饰一个对象,对象中的方法都不加锁

**结论: **线程交替执行

修饰一个对象,对象中的方法都加锁

结论: 线程按序执行

修饰一个对象,对象中的方法一个加锁另一个不加锁

结论: 线程交替执行

类锁

synchronized 修饰的方法或代码块

由于一个class 中的静态方法及静态变量在内存中只有一份,无论这个class类被实例化多少次。所以,一旦一个 静态方法被声明为 synchronized ,此类所有实例化对象在调用此方法时,都共用一把锁,所以称之为类锁。类锁常用于控制静态方法之间的同步。

修饰一个类

结论: 线程交替执行

同时执行类中修饰过的静态方法和没修饰过的

**结果:**线程交替执行

同时执行类中修饰过的静态方法

结论: 线程按序执行

参考:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 背景
  • 对象锁&&方法锁
    • 修饰多个方法
    • 修饰多个代码块
    • 修饰一个方法,另一个不修饰
    • 修饰一个对象,对象中的方法都不加锁
    • 修饰一个对象,对象中的方法都加锁
    • 修饰一个对象,对象中的方法一个加锁另一个不加锁
  • 类锁
    • 修饰一个类
    • 同时执行类中修饰过的静态方法和没修饰过的
    • 同时执行类中修饰过的静态方法
  • 参考:
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档