文档章节

Java并发

Mercy_丶
 Mercy_丶
发布于 2017/02/26 20:27
字数 970
阅读 23
收藏 0
点赞 0
评论 3

并发的基础理念

并发的由来

在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
博文 36
码字总数 15339
作品 0
加载中

评论(3)

我是偶哦
我是偶哦

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

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

引用来自“Mercy_丶”的评论

是挺丑的
:flushed:
Mercy_丶
Mercy_丶

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

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

暂无相关文章

编译安装apache2.4.33

1. 环境 编译安装apache2.4.33,错误 error: ld returned 1 exit status。 CentOS 7.2apr-1.6.3apr-util-1.6.1httpd-2.4.33 2. 编译报错 编译安装完 apr apr-util 之后,安装httpd-2.4.3......

周云台 ⋅ 11分钟前 ⋅ 0

jsonrpc-4j代码解析

解析文件 AutoJsonRpcServiceImplExporter JsonServiceExporter AutoJsonRpcServiceImplExporter 路径:com.googlecode.jsonrpc4j.spring.AutoJsonRpcServiceImplExporter AutoJsonRpcServi......

郭恩洲_OSC博客 ⋅ 19分钟前 ⋅ 0

百度搜索

from selenium import webdriver import time brower=webdriver.Firefox() brower.get('http://www.baidu.com') input=brower.find_element_by_id('kw') input.send_keys('中南大学') time.s......

南桥北木 ⋅ 26分钟前 ⋅ 0

tomcat 日志记录器

1、日志记录器是记录消息的组件 日志记录器需要与某个servlet 容器相关联 2、Logger 接口 共定义了5种日志级别:FATAL、ERROR、WARNING、INFORMATION、DEBUGGER setVerbosity 设置级别 setC...

职业搬砖20年 ⋅ 27分钟前 ⋅ 0

Thrift RPC实战(三) Thrift序列化机制

1.Thrift基础架构 Thrift是一个客户端和服务端的架构体系,数据通过socket传输; 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports); 通过IDL脚本对传输数据的数据结构...

lemonLove ⋅ 28分钟前 ⋅ 0

网站建设就要像2018世界杯的俄罗斯队大杀四方[图]

今天心情不错,因为昨天晚上观看了世界杯比赛,尤其是对俄罗斯队的大杀四方感到十分霸气侧漏啊,因此我联想到了自己的博客网站,我的博客是去年年底上线的,一直想建设一个关于读书和读后感作...

原创小博客 ⋅ 37分钟前 ⋅ 0

Greenplum 三节点安装教程(非root用户)

Greenplum 三节点安装教程(非root用户) 环境准备 安装vmware,装三台centos 虚拟机设置: 主机名 IP 内存 硬盘 node1 Xxx1 2G 80G node2 Xxx2 2G 80G node3 Xxx3 2G 80G CSDN下载greenplum...

仔仔1993 ⋅ 37分钟前 ⋅ 0

linux 信号机制

signal(SIGPIPE, SIG_IGN); TCP是全双工的信道, 可以看作两条单工信道, TCP连接两端的两个端点各负责一条. 当对端调用close时, 虽然本意是关闭整个两条信道, 但本端只是收到FIN包. 按照TCP协...

xxdd ⋅ 38分钟前 ⋅ 0

SpringWind

环境搭建和系统部署

颖伙虫 ⋅ 57分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部