java线程基础巩固---同步代码块以及同步方法之间的区别和关系
2017-12-16 21:46
393 查看
在上一次中【http://www.cnblogs.com/webor2006/p/8040369.html】采用同步代码块的方式来实现对线程的同步,如下:
对于同步方法我想都知道,就是将同步关键字声明在方法上滴,那如果改用这种同步方式会怎样呢?下面实验下:
编译运行:
发现全被一号窗口执行了,另外两个线程都木有输出,这是为啥呢?这时就需要来分析执行流程了:
此时就可以晓得为啥全部由1号线执行了,因为其它线程还在等待1号线程释放锁,1号线程木有执行完当然其它线程也得不到锁啦,当1号线程执行完之后就退出了,接下来:
另外需要说明的是,此处同步方法同步的是this,也就是当前对象,那显示目前改成同步方法之后不是我们期望的执行结果,那如何不用同步块还是用同步方法的方式来达到之前同步块的效果:也就是三个线程都可以执行到,这时就需要对代码进行重构啦,如下:
这时再编译运行:
这样就将同步块的方式换成了同步方法,其执行结果一样,对于线程同步时尽量小范围去加,而不是一上来就直接给方法上上锁,不过具体根据实际的业务场景来决定。
对于同步方法我想都知道,就是将同步关键字声明在方法上滴,那如果改用这种同步方式会怎样呢?下面实验下:
编译运行:
发现全被一号窗口执行了,另外两个线程都木有输出,这是为啥呢?这时就需要来分析执行流程了:
此时就可以晓得为啥全部由1号线执行了,因为其它线程还在等待1号线程释放锁,1号线程木有执行完当然其它线程也得不到锁啦,当1号线程执行完之后就退出了,接下来:
另外需要说明的是,此处同步方法同步的是this,也就是当前对象,那显示目前改成同步方法之后不是我们期望的执行结果,那如何不用同步块还是用同步方法的方式来达到之前同步块的效果:也就是三个线程都可以执行到,这时就需要对代码进行重构啦,如下:
这时再编译运行:
这样就将同步块的方式换成了同步方法,其执行结果一样,对于线程同步时尽量小范围去加,而不是一上来就直接给方法上上锁,不过具体根据实际的业务场景来决定。
相关文章推荐
- Python2.7 以及 Python 3.5的实例方法,类方法,静态方法之间的区别及调用关系
- 二.OC基础--1,对象的存储细节,2,#pragma mark指令,3,函数和对象方法的区别,4,对象和方法之间的关系 ,5.课堂习题
- java线程基础巩固---数据同步引入并结合jconsole,jstack以及汇编指令认识synchronized关键字
- java基础(八)Math/代码块/继承成员方法指南的关系/继承中成员变量之间的关系/方法的重写/继承中构造方法之间的关系/this和super的区别
- Python——class的基础知识(Python的实例方法,类方法,静态方法之间的区别及调用关系)
- block(代码块)的介绍以及使用方法和变量之间的关系
- [转载]字节码问题--wchar和char的区别以及wchar和char之间的相互转换字符编码转换等方法及函数介绍
- UML基础(一)——UML中的类(接口)以及类关系的表示方法
- UML基础(二)——UML中的类(接口)以及类关系的表示方法
- C#基础篇 重写与重载,以及其中设计的虚方法和抽象方法的使用和区别
- java基础巩固系列(一):override和overload之间的区别
- UML基础(一)——UML中的类(接口)以及类关系的表示方法
- 同步方法与同步代码块的区别?
- UML基础(二)——UML中的类(接口)以及类关系的表示方法
- java基础巩固系列(二):Integer与int之间的区别
- 分治策略、动态规划、贪婪选择以及递归之间的关系与区别(-)
- 一道面试题:解析方法中对象存放以及堆栈之间的关系
- Ajax访问不断变化的session的值不同步解决方法以及HTTP协议中的GET、POST的区别
- java基础之问题:请说出hashCode方法、equals方法、HashSet、HashMap之间的关系
- 浅谈C# 中的lock 方法与Monitor 类的关系_以及同步与互斥