java中synchronized(同步代码块和同步方法)详解及区别
问题的由来:
看到这样一个面试题:
?
1 2 3 4 5 6 |
|
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 |
|
?
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 |
|
这段小代码片段打印结果如下:
?
1 2 3 4 |
|
这段代码的打印结果是,methodA…..methodC…..会很快打印出来,methodB…..会隔一段时间才打印出来,那么methodB为什么不能像methodC那样很快被调用呢?
在启动线程1调用方法A后,接着会让线程1休眠5秒钟,这时会调用方法C,注意到方法C这里用synchronized进行加锁,这里锁的对象是str这个字符串对象。但是方法B则不同,是用当前对象this进行加锁,注意到方法A直接在方法上加synchronized,这个加锁的对象是什么呢?显然,这两个方法用的是一把锁。
*由这样的结果,我们就知道这样同步方法是用什么加锁的了,由于线程1在休眠,这时锁还没释放,导致线程2只有在5秒之后才能调用方法B,由此,可知两种加锁机制用的是同一个锁对象,即当前对象。
另外,同步方法直接在方法上加synchronized实现加锁,同步代码块则在方法内部加锁,很明显,同步方法锁的范围比较大,而同步代码块范围要小点,一般同步的范围越大,性能就越差,一般需要加锁进行同步的时候,肯定是范围越小越好,这样性能更好*。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
java中synchronized(同步代码块和同步方法)详解及区别相关推荐
- java同步方法完成案例_Java同步代码块和同步方法原理与应用案例详解
本文实例讲述了java同步代码块和同步方法.分享给大家供大家参考,具体如下: 一 点睛 所谓原子性WOmoad:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况.言外之意是这段代码就像原子一 ...
- java 同步块原理_Java同步代码块和同步方法原理与应用案例详解
Java同步代码块和同步方法原理与应用案例详解 发布于 2020-8-7| 复制链接 摘记: 本文实例讲述了Java同步代码块和同步方法.分享给大家供大家参考,具体如下:一 点睛所谓原子性:一段代码要 ...
- java同步方法同步块_java 同步代码块与同步方法
同步代码块 synchronized(obj) {//代码块 } obj 为同步监视器,以上代码的含义为:线程开始执行同步代码块(中的代码)之前,必须先获得对同步监视器的锁定. 代码块中的代码是执行代 ...
- 同步监视器之同步代码块、同步方法
如果有多个线程访问共享资源,可能会出现当一个线程没有处理完业务,然后另一个线程进入,从而导致共享资源出现不安全的情况. 日常例子:银行取钱,A和B有拥有同一个银行账户,A用存折在柜台取钱,B在取款机取 ...
- 多线程(并发)买票的案例详解同步代码块和同步方法 (复习)
文章目录 前言 简单的原理: 队列+锁 常见的买票案例(线程安全:多个线程操作同一个数据.) 结果: 使用同步代码块或者同步方法(解决线程不安全的问题) 添加的方式一:synchronized 关键字 ...
- java构造块_java中的静态代码块、构造代码块、构造方法详解
运行下面这段代码,观察其结果: package com.test; public class HelloB extends HelloA { public HelloB() { } { System. ...
- java中sleep()、wait()相同与不同详解
java中sleep().wait()相同与不同详解 相同 java中Thread#sleep和Object#wait方法都是暂停当前线程,当前线程让出CPU占用.并不存在调用sleep后还占用CPU ...
- Java中的宏变量,宏替换详解。
转载自 Java中的宏变量,宏替换详解. 群友在微信群讨论的一个话题,有点意思,特拿出来分享一下. 输出true false 来看下面这段程序,和群友分享的大致一样. public static vo ...
- 0037 Java学习笔记-多线程-同步代码块、同步方法、同步锁
什么是同步 在上一篇0036 Java学习笔记-多线程-创建线程的三种方式示例代码中,实现Runnable创建多条线程,输出中的结果中会有错误,比如一张票卖了两次,有的票没卖的情况,因为线程对象被多条 ...
最新文章
- 20180611-20180615
- 主线程等待线程池所有任务完成
- CF 1638 E. Colorful Operations set 区间平推
- qr码是二维码码_如何使用QR码进行有效的营销和推广
- linux禁止u盘自动运行,求设置U盘自动运行和禁止运行的方法。
- c++ 舞伴配对问题_R绘图:配对样本差异表达作图ggpubr
- 设计模式之我见系列——策略模式
- STM32H743+Cube-Keil上移植RTX5实时系统
- 动物行为检测计算机视觉_基于红外热成像和计算机视觉的动物行为研究系统便是其中一例...
- VC6和VS2005(及2010)的一些区别总结
- memset 和 fill 初始化数组
- ajax怎么添加表单,使用Ajax动态地将表单添加到Django表单集
- mysql数据库的超级管理员名称_MySQL数据库的超级管理员用户的名称是__________。...
- 2021年茶艺师(中级)考试内容及茶艺师(中级)考试总结
- 手机测试中的ICCID是什么?
- 半岛铁盒平板测评--真的很垃圾的平板-怎么修改CPU型号
- 按键精灵移动端系列 - IOS(苹果版)安装1.3.8 deb
- 判断字符串数组能否首尾相连
- AT24C04 eeprom读写测试
- 香港科技大学(广州)教职科研人员招聘网站上线啦~
热门文章
- CentOs7.2编译安装Nginx服务器
- 静态顺序表的基本操作
- 第九周 10.25-10.31
- centos永久关闭防火墙
- ios sqlite3 初级应用
- 判断 Java 中的空字符串
- asp.net 之高速缓存
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第16篇]描述DSA、Schnorr和RSA-FDH的密钥生成、签名和验证算法。
- 计算机科学中的研究成果,田聪教授团队科研成果在计算机科学顶会LICS 2020发表...
- 某项目的双代号网络图如下所示_2019一级建造师项目管理知识点大全3