hooyantsing's Blog

20_同步方法及同步块

字数统计: 638阅读时长: 2 min
2020/08/21

20 同步方法及同步块

狂神说Java 多线程详解

这一节是 重难点 ,详见 Synchronized的使用

副本: 辅佐资料_Java笔记本 【Java并发编程之深入理解】Synchronized的使用_青苔小榭-CSDN博客_synchronized

同步方法

  • 由于我们可以通过 private 关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是 synchronized 关键字,它包括两种用法:synchronized 方法synchronized 块

    1
    同步方法: public synchronized void method(int args) {}
  • synchronized 方法控制对”对象”的访问,每个对象对应一把锁,每个synchronized方法都必须获得调用该方法的对象的锁才能执行,否则线程会阻塞,方法一旦执行,就独占该锁,直到该方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行。

    1
    缺陷: 若将一个大的方法申明为 synchronized 将会影响效率
  • 方法里面需要 修改 的内容才需要锁,锁的太多,浪费资源。

    同步块

  • 同步块:synchronized(Obj){}

  • Obj 称之为 同步监视器 * Obj 可以是任何对象,但是推荐使用共享资源作为同步监视器

    • 同步方法中无需指定同步监视器,因为同步方法的同步监视器就是 this,就是这个对象本身,或者是 class
  • 同步监视器的执行过程 1. 第一个线程访问,锁定同步监视器,执行其中的代码。

    1. 第二个线程访问,发现同步监视器锁定,无法访问。
    2. 第一个线程访问完毕,解锁同步监视器。
    3. 第二个线程访问,发现同步监视器没有锁,然后锁定并访问。

      第三方资料

这一节是 重难点 ,详见 Synchronized的使用

副本: 辅佐资料_Java笔记本 【Java并发编程之深入理解】Synchronized的使用_青苔小榭-CSDN博客_synchronized

  • 对于普通同步方法,锁是当前实例对象。 如果有多个实例 那么锁对象必然不同无法实现同步。
  • 对于静态同步方法,锁是当前类的Class对象。有多个实例 但是锁对象是相同的 可以完成同步。
  • 对于同步方法块,锁是Synchonized括号里配置的对象。对象最好是只有一个的,如当前类的 class 是只有一个的,锁对象相同,也能实现同步。 锁竟争资源可以。
CATALOG
  1. 1. 20 同步方法及同步块
    1. 1.0.1. 同步方法
    2. 1.0.2. 同步块
  • 2. 第三方资料