文档章节

Synchronized

learn_more
 learn_more
发布于 2016/08/27 14:54
字数 546
阅读 116
收藏 1

1、JavaSE 1.6 之前都认为synchronized是重量级锁,但是1.6进行了各种优化操作,所以并不是想象中那么重了,虽然synchronized的地方使用Lock都能实现,但是synchronized用处还是很广泛。

 

2、加锁的规则

1)对于普通的同步方法,锁是当前实例对象;

2)对于静态的同步方法,锁是当前类的class对象;

3)对于同步方法块,锁是synchronized括号里配置的对象。

 

3、访问synchronized标记的地方必须先获得锁,否则会阻塞在方法之外,退出或抛异常都是自动释放锁,让其他阻塞的线程竞争获取锁。

 

4、synchronized 保证共享变量的可见性和原子性

synchronized 实际上是对访问修改共享变量的代码块进行加互斥锁,多个线程对synchronized代码块的访问时,某一时刻仅仅有一个线程在访问和修改代码块中的内 容(加锁),其他所有的线程等待该线程离开代码块时(释放锁)才有机会进入synchronized代码块。所以某一个线程进入synchronized代码块前后,执行过程入如下:

1)当前线程获得互斥锁

2)清空工作内存(当前CPU的缓存副本)

3)从主内存拷贝共享变量最新的值到工作内存成为副本,保证共享变量的可见性

4)执行代码,一直持有锁,保证操作的原子性

5)将修改后的副本的值刷新回主内存中,通知其他CPU副本无效

6)代码块运行完成或抛出异常,线程释放锁

7)其他阻塞的线程从新竞争获取锁

8)其他线程进入synchronized代码块,然后重复1-8.

 

5. synchronized和volatile比较

1)volatile不需要同步操作,所以效率更高,不会阻塞线程,但是适用情况比较窄

2)synchronized既能保证共享变量可见性,也可以保证锁内操作的原子性;volatile只能保证可见性

 

© 著作权归作者所有

上一篇: volatile
learn_more
粉丝 93
博文 240
码字总数 210196
作品 0
深圳
程序员
私信 提问
加载中

评论(0)

synchronized与static synchronized 的区别

最近做java多线程开发处理中发现synchronized的使用还是有一些细节问题要注意的。 1.synchronized与static synchronized 的区别 synchronized是对类的当前实例进行加锁,防止其他线程同时访问...

断桥是否下过雪
2013/12/14
177
0
多线程学习笔记(八)

注: 当一个线程执行的代码出现异常时,其所持有的锁会自动释放 同步不具有继承性 不在synchronized块中就是一部执行,在synchronized中就是同步执行 和synchronized方法一样,synchronized(thi...

scymore
2016/09/07
18
0
学习笔记6:synchronized关键字-->线程同步

为什么要使用关键字synchronized? java程序中可以存在多个线程,但是当多个线程操作同一资源时候,可能会导致数据不一致。 区分synchronized方法与synchronized块: synchronized方法是一种粗...

牧羊人Berg
2015/11/07
228
0
java并发编程(1)——synchronized关键字解析

synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchro...

十二缸帕萨特
2014/04/12
62
0
synchronized 之 对象锁 和 类锁

一、synchronized(object) 如果object没有被加锁,则获取object的锁;如果object已经被加锁则等待object的锁被释放。 二、需要加锁的情景 多线程共享同一资源会引起线程安全的情况下,才需要...

MyOldTime
2018/09/21
53
0

没有更多内容

加载失败,请刷新页面

加载更多

21天完美搞定Vue框架技术(第3天)

前言: 上一节我们主要学的是【选项合并】,了解了初始化阶段各个选项的合并策略, 本节课我们来学一下【数据代理】这个知识点。 1、数据代理的定义 数据代理,也叫作数据劫持。有两个核心作...

有鱼是只猫
39分钟前
39
0
OSChina 周二乱弹 —— 一山里不容二猫

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @薛定谔的兄弟 :分享洛神有语创建的歌单「我喜欢的音乐」: 《数え歌》- 池田綾子 手机党少年们想听歌,请使劲儿戳(这里) @诺墨 :哈哈哈哈...

小小编辑
53分钟前
43
1
敏捷开发验收评审会议

迭代验收评审是Scrum中的重要活动之一,迭代验收评审会议召开过程是否符合敏捷原则,实践是否贴近实际,参照以下:要点一:参加迭代验收评审会议的角色是否完整和投入 ●敏捷团队所有...

沐沐爸比
今天
43
0
js 获取文件本地内存路径

URL.createObjectURL(file)

DrChenXX
今天
51
0
CentOS 6.5 安装 Hadoop 集群【未完】

1、安装 CentOS 6.5 2、关闭 iptables 3、关闭 suliunx 4、修改 IP 4、修改 hostname 5、修改 hosts 6、SSH 免密 7、JDK(1.8)安装 华为镜像直达 8、...

产品哥
今天
59
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部