JAVA语言多线程学习之对象及变量的并发访问
小标 2019-01-09 来源 : 阅读 1027 评论 0

摘要:本文主要向大家介绍了JAVA语言多线程学习之对象及变量的并发访问,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。

本文主要向大家介绍了JAVA语言多线程学习之对象及变量的并发访问,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。


1:”非线程安全”问题在于”实例变量”中,如果是方法内部的私有变量,则不存在”非线程安全”问题.


2:关键字synchronized取得的都是对象锁,而不是把一段代码或方法(函数)当做锁, 所以哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象.


(注:如果多个线程访问多个对象,则JVM会创建多个锁)==


3:A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法


4:A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型的方法,则需要等待,也就是同步


5:一个synchronized方法/块的内部调用的其他synchronized方法/块时,是永远可以得到锁的.


6:当存在父子类继承关系时,子类是完全可以通过”可重入锁”调用父类的同步方法的.


7:出现异常的锁被自动释放.


8:在使用同步synchronized(this)代码块时需要注意的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对同一个object中的所有其他synchronized(this)同步代码块的访问将被阻塞,这说明synchronized使用的”对象监视器”是一个.


9:synchronized代码块具有同步性


10:synchronized(this)代码块是锁定当前对象的


(1)synchronized同步方法


1)对其他synchronized同步方法或synchronized(this)代码块调用呈阻塞状态


2)同一时间只有一个线程可以执行synchronized同步方法中的代码


(2)synchronized(this)同步代码块


1)对其他synchronized同步方法或synchronized(this)代码块调用呈阻塞状态


2)同一时间只有一个线程可以执行synchronized(this)同步代码块中的代码


11:对于synchronized(非this对象x)同步代码块


1)在多个线程持有”对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码


2)当持有”对象监视器”为同一个对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象x)同步代码块中的代码


12:同步代码块放在非同步synchonized方法中进行声明,并不能保证调用方法的线程的执行同步/顺序性,也就是线程调用方法的顺序是无序的,虽然在同步块中执行的顺序是同步的,这样极易出现”脏读”问题


同步代码块


13:”synchronized(非this对象x)”格式的写法是将x对象本身作为”对象监视器”,这样就可以得出以下3个结论:


1)当多个线程同时执行synchronized(x){}同步代码块时呈现同步效果.


2)当其他线程执行x对象中synchronized同步方法时呈现同步效果.


3)当其他线程执行x对象方法里面synchronized(this)代码块时也呈现同步效果.


14:synchronized关键字加到static静态方法上是给Class类上锁,而synchronized关键字加到非static静态方法上是给对象加锁


15:异步的原因是持有不同的锁,一个是对象锁,一个是Class锁,而Class锁可以对类的所有对象实类起作用,同步synchronized(Class)代码块的作用其实和synchronized static方法的作用是一样的


16:将synchronized(String)同步块与String 联合使用时,要注意常量池以带来的一些例外.,因此在大多数的情况下,同步synchronized代码块都不使用String作为锁对象,而改用其他.比如new Object() 实例化一个Object对象,但它并不放入缓存中.


17:只要对象不变,即使对象的属性被改变,运行的结果还是同步的.


18:关键字volatile的主要作用是使变量在多个线程间可见


19:关键字volatile的作用是强制从公共堆栈中取变量的值,而不是从线程私有数据栈中取得变量的值


20:关键字与synchronized进行比较:


1)关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块


2)多线程访问volatile不会发生阻塞,而synchronized会出现阻塞


3)volatile能保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存和公共内存中的数据同步.


4)关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的是多线程之间访问资源的同步性


21:volatile关键字只有可见性,不具备同步性,也就不具备原子性.


22:原子类也并不完全安全,因为方法是原子性的,但是方法和方法之间的调用却不是原子性的,解决还需要synchronized


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程