文档章节

Java并发

Mercy_丶
 Mercy_丶
发布于 2017/02/26 20:27
字数 1055
阅读 25
收藏 0

并发的基础理念

并发的由来

在Java世界,类变量(static变量)和实例变量(类普通成员变量)是线程间共享的,当多个线程同时访问这些变量时,为了保证变量的数据的一致性必须对变量的访问加以控制--锁,但是锁(synchronize)会导致整个系统的性能低下,于是人们开始通过各种手段来实现高效并发。

互斥同步

synchronize

synchronize是java中最常见最粗暴的的并发手段,synchronize在资源竞争不是很激烈的情况下是很不错,但是一旦处于高并发的情况下性能就大大降低了,Java中HashTable与synchronize密切相关,几乎所有方法都加上synchronize。

ReentrantLock

其实ReentranLock和synchronize原理一样,也是通过java加锁来实现同步。
他同lock()和unLock()来实现加锁和锁释放。此外ReentranLock还增加一下三项高级功能: 等待可中断 ,可实现公平锁 ,锁可以绑定多个条件.

从性能来说,在JDK1.5之前ReentrantLock要优于synchronize,但是1.6JDK及以上对synchronize做了很多针对锁的优化措施,性能上两者几乎持平。所以单从性能上,JDK1.6以后的版本推荐使用synchronized。

非阻塞式同步

互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能问题,因此这种同步也称为阻塞同步。从处理问题的方式来说,互斥同步是一种悲观并发策略,因为他总是以为不加同步措施就会出现问题。
于是人们就有了另外一种选择:基于冲突检测的乐观并发策略,乐观并发策略很多实现都是不需要吧线程挂起,因此这种同步操作称为非阻塞同步。

CAS指令

CAS(compare and swap)即比较交换,随着硬件的发展,这条看上去是需要多次操作才能完成的行为只需要处理器一条指令就能完成。
CAS指令需要3个操作数,分别是内存位置(在Java中可以简单理解为变量的内存地址,用V表示)、旧的预期值(用A表示)和新值(用B表示)。CAS指令执行时,当且仅当V=A时,就用新值B来更新V的值,否则就不执行更新。(当无论V是否更新了值都放回V的就值),上述就是一个原子操作。
在Java中,sun.misc.Unsafe类里面就提供了compareAndSwapInt()compareAndSwapLong() 等操作方法。在原子类中AtomicInteger就有体现。在JDK8中ConcurrentHashMap就是使用这样的方法实现的(JDK8之前是用分段锁方式实现)。

关于volatile型变量

说到并发人们常常会提到volatile。volatile变量是Java提供的轻量级的同步机制,但是在真正的开发中并没有得到重视。

并发中的三个特性

在介绍volatile之前先介绍一下并发中的三个特性:

  • 原子性
  • 可见性
  • 有序性

volatile变量第一个特性就是: 保证变量在所有线程的可见性。(即线程更新完立即同步回主内存)
volatile变量第二个特性就是:禁止指令重排序优化,保证有序性。
所以说volatile变量不能保证变量操作的的原子性,所以应用volatile变量在并发场景中一定要慎重。
符合下列场景可以使用volatile变量,负责依然需要加锁来保证操作的原子性:

  • 运算结果不依赖变量的当前值,或者能够确保只有单一的线程修改变量的值。
  • 变量不需要与其他的状态变量共同参与不变约束。

© 著作权归作者所有

共有 人打赏支持
Mercy_丶
粉丝 7
博文 39
码字总数 15485
作品 0
加载中

评论(3)

我是偶哦
我是偶哦

引用来自“我是偶哦”的评论

不知道为什么,感觉布局好丑

引用来自“Mercy_丶”的评论

是挺丑的
:flushed:
Mercy_丶
Mercy_丶

引用来自“我是偶哦”的评论

不知道为什么,感觉布局好丑
是挺丑的
我是偶哦
我是偶哦
不知道为什么,感觉布局好丑

暂无文章

DeepMind 开源图神经网络的代码

用于支持论文《Relational inductive biases, deep learning, and graph networks》。 github A graph network takes a graph as input and returns a graph as output. The input graph has......

shengjuntu
6分钟前
0
0
python2编码详解、一

以前使用python3没觉的什么,跟着公司使用python2后被编码问题折磨的痛不欲生,好好研究了一下编码问题,参考了很多博文,加入自己的理解,这里只是对编码的介绍,下一篇是python2中编码问题...

hc321
15分钟前
0
0
基于OpenSSL的一些常用加密签名算法

目前包括:MD5、SHA512、DES、RSA加解密、RSA+MD5签名验证算法,在openssl基础上再进行封装,使用简单,头文件需要包含openssl库,可以使用vcpkg自动管理,省去繁琐的配置工程的过程。 该RSA...

LoSingSang
23分钟前
0
0
spring Data JPA

什么是JPA? 全称Java Persistence API,可以通过注解或者XML描述【对象-关系表】之间的映射关系,并将实体对象持久化到数据库中。 为我们提供了: 1)ORM映射元数据:JPA支持XML和注解两种元...

狼王黄师傅
28分钟前
0
0
微信小程序 - 使用七牛云 API 截取第 n 秒图像为封面图

前面分享过七牛的上传操作,在这里说下使用七牛 api 对视频在页面的处理,比如你的视频上传之后获取七牛视频链接,这时候你怎么展示它呢? 在页面可以使用小程序提供的原生组件 video ,可以...

几个栗子
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部