synchronized 回顾

本贴最后更新于 1650 天前,其中的信息可能已经斗转星移

Synchronized

  • Synchronized 的作用:保证在同一时刻只有一个线程执行该段代码,保证并发安全

  • 对象锁

    • 方法锁。锁定一个方法,锁对象是 this 对象
    • 同步代码块锁,锁定一个代码块,锁对象是自己指定的
  • 类锁:虽然叫类锁,其实是 Class 对象的锁

    • 加到 static 方法上
    • synchronized(xxx.class)
  • 几种同步情况,判断是否同步,就看多个线程访问的代码的锁是不是同一把就可以了。

    • 两个线程访问同一个对象的同步方法——由于同步方法的锁对象是一个 this,串行访问
    • 两个线程访问两个对象不同的同步方法——对象不同,互不干扰,并行访问
    • 两个线程访问 Synchronized 修饰的 static 方法,都是类锁,串行
    • 访问同一个对象的同步方法与非同步方法——非同步就没有锁,并行
    • 访问同一个对象的不同同步方法——都是同一个 this,串行
    • 同时访问静态 syn 和非静态 syn——不是同一把锁,并行
    • 一个线程在 syn 中抛出异常,另外一个进程会立即进入。
  • 总结

    • 对象锁,只有访问到同一个对象,才会同步。例如 a.synfunc 和 a.syncunc 或者 a.synfunc 和 a.synfund 都会锁住。
      • 类锁,这个类产生的所有对象都公用这一把锁,访问任何一个对象都会同步。例如访问 a.synfunc 和 b.syncunc 或者 a.synfunc 或者 b.synfund 都会被锁住
      • 想要锁住一个代码,就必须让锁,是唯一的!
    public class SynchronizeTest {    //第一种,使用一个互斥对象锁住代码块;它可以这么理解,多个线程想访问互斥代码块,必须拿到mutex对象的锁。    // 然后,后面的所有类型都可以用第一种类型来解释    Object mutex = new Object();    public void methodA() {        synchronized (mutex) {            //codeAAAAAAAAAAAAAAAAAAA       }   }    //第二种,锁住整个非静态method    public synchronized void methodB() {        //codeBBBBBBBBBBBBBBBBB   }    //第二种相当于用this对象来锁住方法    public void methodBB(){        synchronized (this){            //codeBBBBBBBBBBBBBBBBB       }   }    //第三种,使用this锁住一个代码块,这个其实和第二种一样    public void methodC() {        synchronized (this) {            //codeCCCCCCCCCCCCCCCCCC       }   }    //第四种,锁住整个静态method    public static synchronized void methodD() {        //codeDDDDDDDDDDDDDDDDDDD   }    //第四种相当于用类对象锁住代码块    public static void methodDD(){        synchronized (SynchronizeTest.class){            //codeDDDDDDDDDDDDDDDDDDD       }   } }
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • danl
    174 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖 • 2 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 187 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    412 引用 • 3588 回帖 • 1 关注
  • gRpc
    11 引用 • 9 回帖 • 99 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 251 关注
  • 新人

    让我们欢迎这对新人。哦,不好意思说错了,让我们欢迎这位新人!
    新手上路,请谨慎驾驶!

    52 引用 • 228 回帖
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖 • 1 关注
  • Visio
    1 引用 • 2 回帖 • 1 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 271 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    180 引用 • 3878 回帖 • 1 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 257 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 661 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖
  • CodeMirror
    2 引用 • 17 回帖 • 167 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 1 关注
  • 游戏

    沉迷游戏伤身,强撸灰飞烟灭。

    185 引用 • 825 回帖 • 1 关注
  • 锤子科技

    锤子科技(Smartisan)成立于 2012 年 5 月,是一家制造移动互联网终端设备的公司,公司的使命是用完美主义的工匠精神,打造用户体验一流的数码消费类产品(智能手机为主),改善人们的生活质量。

    4 引用 • 31 回帖
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 465 关注
  • GAE

    Google App Engine(GAE)是 Google 管理的数据中心中用于 WEB 应用程序的开发和托管的平台。2008 年 4 月 发布第一个测试版本。目前支持 Python、Java 和 Go 开发部署。全球已有数十万的开发者在其上开发了众多的应用。

    14 引用 • 42 回帖 • 818 关注
  • 叶归
    11 引用 • 47 回帖 • 20 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 3 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 223 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 106 关注