Java多线程并发锁和原子操作,你真的了解吗?
来源:互联网 发布:手机淘宝安全中心官网 编辑:程序博客网 时间:2024/05/20 09:07
目录(?)[-]
- 前言
- volatile
- synchronized
- javautilconcurrentlocksReentrantLock
- 实际场景
前言
对于Java多线程,接触最多的莫过于使用synchronized,这个简单易懂,但是这synchronized并非性能最优的。今天我就简单介绍一下几种锁。可能我下面讲的时候其实很多东西不会特别深刻,最好的方式是自己做实验,把各种场景在代码中实验一下,这样发发现很多细节。
volatile
synchronized
这个作为Java中“重量级”的线程安全机制被大家所熟知,这个就不在这里做解释了。
java.util.concurrent.locks.ReentrantLock
java.util.concurrent.中是JDK1.5中出的对于一些并发操作的类库,其中包括很多同学很喜欢的原子类,比如说AtomicInteger。它里面原理就是一个CAS,这里就不做过多的阐述,有兴趣的可以看看源码。
好,说一下ReentrantLock,这个锁主要是能显示的添加锁和释放锁,好处是更加灵活,能够更加准确的控制锁,也能确保系统的稳定,比如说“重连”。后面代码会有使用到。
实际场景
输出结果:
从上面的输出结果来看真是让人大感意外:只有原子操作AtomicInteger的结果保证了多线程的安全性,而其他不管是用轻量级的volatile还是重量级的synchronized都没有达到我们想要的效果。这也让我产生了大在的怀疑。难道问题真的这么蹊跷?
从这里不难看出除了AtomicInteger用的是其自己的方法而其他都是用到了Java的语法糖++操作。而这让我想起了++操作并非原子操作,而可能在其中间操作导致了其他线程对其他进行了修改,虽然同样的问题我在《Think in Java》中也找到可以佐证的例子。这里有一个问题就是synchronized:因为我对si已经加了synchronized操作,但是输出的结果令人意外,难道还会有问题?这让我想把这段代码编译成字节码的冲动。好吧,下面看字节码(这里我单独把synchronized这一段操作抽出来,作为分析,其他几个就算了,不然编译后的字节码有点多)
为了方便看,先贴出源代码
下面是字节码,为了节省篇幅,一些不重要的部分我将不贴出
从这里一看从monitorenter进入安全区到monitorexit出安全区没有发现si是处于中间状态的,那又是在哪出的问题呢?这里简单说一下,归根结底仍然是(++)操作非原子操作,可是很多人疑惑了,这里不是加锁了吗?废话不多说,在我的深入探析Java线程锁机制有一个比较详细的分析。
- Java多线程并发锁和原子操作,你真的了解吗?
- Java多线程并发锁和原子操作,你真的了解吗?
- C#中的原子操作Interlocked,你真的了解吗?
- C#中的原子操作Interlocked你真的了解吗?
- Java多线程/并发16、Atomic原子变量和原子操作
- 多线程并发锁和原子操作
- JAVA多线程中,原子操作的概念——原子操作真的不需要进行同步控制吗?
- Java多线程总结(5)— 原子性、可见性、有序性和并发库的原子性操作
- 你真的了解volatile关键字吗?深入解析java并发与volatile
- (转)你真的了解 “事务与并发”吗?
- 你真的了解Java吗?
- 多线程锁和原子操作
- Java 并发 ---原子操作的实现原理
- 原子操作和线程的并发执行
- java多线程之线程并发库原子性操作类
- Javascript的DOM操作 - 你真的了解吗?
- Java多线程编程--(6)学习Java5.0 并发编程包--原子操作的一些类型
- java多线程-专题-聊聊并发(五)原子操作的实现原理
- java web之面向接口编程
- 如何玩好“用户思维”
- [安卓初学者实验]实现图片的顺逆时针旋转和缩放功能
- 动态一维数组的使用
- [随记]在Hibernate中如何使用Blob数据类型
- Java多线程并发锁和原子操作,你真的了解吗?
- Struts2的核心和工作原理
- 使用android隐藏api实现亮度调节
- 匈牙利算法模版(poj1469)
- Spring 4开发所依赖的最基本jar包
- [随记]python类的专有方法
- 调试nodejs的方法(node-inspector)
- 产品体验报告——百词斩
- Java并发(1)-基础概念