问题的由来:

看到这样一个面试题:

?

1

2

3

4

5

6

//下列两个方法有什么区别

public synchronized void method1(){}

public void method2(){

 synchronized (obj){}

}

synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果进行同步,就会发生错误,Java提供的解决方案是:只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他线程不能进来执行可以。解决这个问题。这里在用synchronized时会有两种方式,一种是上面的同步方法,即用synchronized来修饰方法,另一种是提供的同步代码块。

这里总感觉怪怪的,这两种方法有什么区别呢,基础学得不好,于是就动手做了个简单的测试,代码如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

public class SynObj {

  public synchronized void methodA() {

    System.out.println("methodA.....");

    try {

      Thread.sleep(5000);

    } catch (InterruptedException e) {

      e.printStackTrace();

    }

  }

  public void methodB() {

    synchronized(this) {

      System.out.pritntln("methodB.....");

    }

  }

  public void methodC() {

    String str = "sss";

    synchronized (str) {

      System.out.println(    "methodC.....");

    }

  }

}

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

public class TestSyn {

  public static void main(String[] args) {

    final SynObj obj = new SynObj();

    Thread t1 = new Thread(new Runnable() {

      @Override

      public void run() {

        obj.methodA();

      }

    });

    t1.start();

    Thread t2 = new Thread(new Runnable() {

      @Override

      public void run() {

        obj.methodB();

      }

    });

    t2.start();

    Thread t3 = new Thread(new Runnable() {

      @Override

      public void run() {

        obj.methodC();

      }

    });

    t3.start();

  }

}

这段小代码片段打印结果如下:

?

1

2

3

4

methodA.....

methodC.....

//methodB会隔一段时间才会打印出来

methodB.....

这段代码的打印结果是,methodA…..methodC…..会很快打印出来,methodB…..会隔一段时间才打印出来,那么methodB为什么不能像methodC那样很快被调用呢?

在启动线程1调用方法A后,接着会让线程1休眠5秒钟,这时会调用方法C,注意到方法C这里用synchronized进行加锁,这里锁的对象是str这个字符串对象。但是方法B则不同,是用当前对象this进行加锁,注意到方法A直接在方法上加synchronized,这个加锁的对象是什么呢?显然,这两个方法用的是一把锁。

*由这样的结果,我们就知道这样同步方法是用什么加锁的了,由于线程1在休眠,这时锁还没释放,导致线程2只有在5秒之后才能调用方法B,由此,可知两种加锁机制用的是同一个锁对象,即当前对象。

另外,同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好*。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

java中synchronized(同步代码块和同步方法)详解及区别相关推荐

  1. java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解

    本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...

  2. java 同步块原理_Java同步代码块和同步方法原理与应用案例详解

    Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...

  3. java同步方法同步块_java 同步代码块与同步方法

    同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...

  4. 同步监视器之同步代码块、同步方法

    如果有多个线程访问共享资源,可能会出现当一个线程没有处理完业务,然后另一个线程进入,从而导致共享资源出现不安全的情况. 日常例子:银行取钱,A和B有拥有同一个银行账户,A用存折在柜台取钱,B在取款机取 ...

  5. 多线程(并发)买票的案例详解同步代码块和同步方法 (复习)

    文章目录 前言 简单的原理: 队列+锁 常见的买票案例(线程安全:多个线程操作同一个数据.) 结果: 使用同步代码块或者同步方法(解决线程不安全的问题) 添加的方式一:synchronized 关键字 ...

  6. java构造块_java中的静态代码块、构造代码块、构造方法详解

    运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...

  7. java中sleep()、wait()相同与不同详解

    java中sleep().wait()相同与不同详解 相同 java中Thread#sleep和Object#wait方法都是暂停当前线程,当前线程让出CPU占用.并不存在调用sleep后还占用CPU ...

  8. Java中的宏变量,宏替换详解。

    转载自 Java中的宏变量,宏替换详解. 群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 输出true false 来看下面这段程序,和群友分享的大致一样. public static vo ...

  9. 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁

    什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...

最新文章

  1. 20180611-20180615
  2. 主线程等待线程池所有任务完成
  3. CF 1638 E. Colorful Operations set 区间平推
  4. qr码是二维码码_如何使用QR码进行有效的营销和推广
  5. linux禁止u盘自动运行,求设置U盘自动运行和禁止运行的方法。
  6. c++ 舞伴配对问题_R绘图:配对样本差异表达作图ggpubr
  7. 设计模式之我见系列——策略模式
  8. STM32H743+Cube-Keil上移植RTX5实时系统
  9. 动物行为检测计算机视觉_基于红外热成像和计算机视觉的动物行为研究系统便是其中一例...
  10. VC6和VS2005(及2010)的一些区别总结
  11. memset 和 fill 初始化数组
  12. ajax怎么添加表单,使用Ajax动态地将表单添加到Django表单集
  13. mysql数据库的超级管理员名称_MySQL数据库的超级管理员用户的名称是__________。...
  14. 2021年茶艺师(中级)考试内容及茶艺师(中级)考试总结
  15. 手机测试中的ICCID是什么?
  16. 半岛铁盒平板测评--真的很垃圾的平板-怎么修改CPU型号
  17. 按键精灵移动端系列 - IOS(苹果版)安装1.3.8 deb
  18. 判断字符串数组能否首尾相连
  19. AT24C04 eeprom读写测试
  20. 香港科技大学(广州)教职科研人员招聘网站上线啦~

热门文章

  1. CentOs7.2编译安装Nginx服务器
  2. 静态顺序表的基本操作
  3. 第九周 10.25-10.31
  4. centos永久关闭防火墙
  5. ios sqlite3 初级应用
  6. 判断 Java 中的空字符串
  7. asp.net 之高速缓存
  8. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第16篇]描述DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。
  9. 计算机科学中的研究成果,田聪教授团队科研成果在计算机科学顶会LICS 2020发表...
  10. 某项目的双代号网络图如下所示_2019一级建造师项目管理知识点大全3