1、Synchronized关键字
- synchronized关键字是Java并发编程中非常重要的一个工具。它的主要目的是在同一时间只能允许一个线程去访问一段特定的代码,从而保护一些变量或者数据不会被其他线程所修改。这感觉就像一群人抢着去上厕所,而你运气好抢到了,啪把门一锁,厕所的那一平方天地在那段时间就只属于你,即使门外的人排队都排到了地中海(此处排除有人暴力拆厕所的情况)。
- Synchronized的作用主要有三个:
- 原子性:确保线程互斥的访问同步代码;
- 可见性:保证共享变量的修改能够及时可见,其实是通过Java内存模型中的 “对一个变量unlock操作之前,必须要同步到主内存中;如果对一个变量进行lock操作,则将会清空工作内存中此变量的值,在执行引擎使用此变量前,需要重新从主内存中load操作或assign操作初始化变量值” 来保证的;
- 有序性:有效解决重排序问题,即 “一个unlock操作先行发生(happen-before)于后面对同一个锁的lock操作”;
从语法上讲,Synchronized可以把任何一个非null对象作为"锁",在HotSpot JVM实现中,锁有个专门的名字:对象监视器(Object Monitor)。
-
使用synchronized关键字后,都以对象作为锁,一般有以下三种实现形式。
- 1、对于同步方法,锁是当前实例对象。
![](http://ovsiiuil2.bkt.clouddn.com/Xnip2018-08-22_15-17-56.png)
- 2、对于静态同步方法,锁是当前类的Class对象。 当synchronized作用在静态方法时,监视器锁(monitor)便是对象的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该类的一个全局锁;
145天以来,Java架构更新了 428个主题,已经有91位同学加入。微信扫码关注java架构,获取Java面试题和架构师相关题目和视频。上述相关面试题答案,尽在Java架构中。
网友评论