Java 并发总结——高并发与同步锁
一、高并发同步锁
(1)ThreadLocal
threadLocal为每个线程维护一个本地变量。
采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。
ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。
(2)Synchronized 与Lock
ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了 锁投票,定时锁等候和中断锁等候
ReentrantLock获取锁定与三种方式:
1、 lock(), 如果获取了锁立即返回,如果别的线程持有锁,当前线程则一直处于休眠状态,直到获取锁
2、tryLock(), 如果获取了锁立即返回true,如果别的线程正持有锁,立即返回false;
3、tryLock(long timeout,TimeUnit unit), 如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false;
4、lockInterruptibly:如果获取了锁定立即返回,如果没有获取锁定,当前线程处于休眠状态,直到或者锁定,或者当前线程被别的线程中断
synchronized
在资源竞争不是很激烈的情况下,偶尔会有同步的情形下,synchronized是很合适的。原因在于,编译程序通常会尽可能的进行优化synchronized,另外可读性非常好,不管用没用过多线程包的程序员都能理解。
ReentrantLock
ReentrantLock提供了多样化的同步,比如有时间限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。但是当同步非常激烈的时候,synchronized的性能一下子能下降好几十倍。而ReentrantLock确还能维持常态。
(3)Volatile和Synchronized
Volatile和Synchronized四个不同点:
粒度不同,前者针对变量 ,后者锁对象和类
syn阻塞,volatile线程不阻塞
syn保证三大特性,volatile不保证原子性
syn编译器优化,volatile不优化
要使 volatile 变量提供理想的线程安全,必须同时满足下面两个条件:
对变量的写操作不依赖于当前值。
该变量没有包含在具有其他变量的不变式中。
(4)CAS
CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。
(5)Java中Unsafe类详解
1、通过Unsafe类可以分配内存,可以释放内存
类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应。
2、可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的;
3、挂起与恢复
将一个线程进行挂起是通过park方法实现的,调用 park后,线程将一直阻塞直到超时或者中断等条件出现。unpark可以终止一个挂起的线程,使其恢复正常。整个并发框架中对线程的挂起操作被封装在 LockSupport类中,LockSupport类中有各种版本pack方法,但最终都调用了Unsafe.park()方法。
4、cas操作
Java 并发总结——高并发与同步锁相关推荐
- 【java】动态高并发时为什么推荐重入锁而不是Synchronized?
1.概述 转载:http://www.dreamwu.com/post-1758.html 这个图画的不错,有助于加深理解. [Java]Synchronized 有几种用法 [java] 从hots ...
- java设计模式并发_[高并发Java 七] 并发设计模式
[高并发Java 七] 并发设计模式 [高并发Java 七] 并发设计模式 为什么80%的码农都做不了架构师?>>> 在软件工程中,设计模式(design pattern)是对软件设 ...
- 如何掌握java多线程,高并发,大数据方面的技能?
https://www.zhihu.com/question/27575123 如何掌握java多线程,高并发,大数据方面的技能? 因为想进入互联网公司,然后发现互联网类型的公司问的主要问题都离不开这 ...
- 总结-Java多线程与高并发简记
1.什么是多线程? 一个进程可以开启多个线程,每个线程可以并发/并行执行不同任务. 2.Java多线程实现方式 2.1.继承Thread类 2.2.实现Runnable接口方式实现多线程 ...
- 网站高并发及高并发架构详解
高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击,再屌丝点的说法就像玩撸啊撸被ADC暴击了一 ...
- oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...
[高并发]高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 发布时间:2020-04-19 00:47, 浏览次数:126 , 标签: Tomcat 写在前面 随着系统并发量越来越高,Tomc ...
- 慕课网高并发实战(一)-并发与高并发基本概念
课程网址 并发: 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程交替得换入或者换出内存,这些线程是同时"存在"的,每个线程都处于执行过程中的某个状态,如果运行在多核 ...
- java 高并发_Java 高并发之无锁(CAS)
Java 高并发之无锁(CAS) 本篇主要讲 Java中的无锁 CAS ,无锁 顾名思义就是 以不上锁的方式解决并发问题,而不使用synchronized 和 lock 等.. 1. Atomic 包 ...
- Java 并发:第三部分 - 同步锁
2019独角兽企业重金招聘Python工程师标准>>> 在学完如何创建线程和管理他们之后,是时候进入最重要的部分:同步. 同步是壹种让代码线程安全的方式.可以被多個线程访问的代码必须 ...
最新文章
- ul li设置横排,并除去li前的圆点
- 利用UIWebView获取userAgent需要注意的地方
- SqlServer 获取汉字的拼音首字母
- 精度问题——直线方程的系数判断实际生产中三点能否确定一个圆
- 我的创业分享 之 不要轻易选择创业
- window下的SCROLLbar的使用技巧
- 【译】区块链是如何工作的——用JavaScript演示
- 家用工具套装_居家生活必不可少的8款五金工具,便宜又实用
- 第一次 Zul'grub
- SQL Server查询数据库执行记录
- win7系统电脑连接小米蓝牙音箱
- 35岁,你要逃离北上广?
- 2. 确定地球与金星之间的距离 天文学家在1914年8月份的7次观测中,测得地球与金星之间距离(单位:米),并取其常用对数值,与日期的一组历史数据如下表:
- flac转换成mp3,flac转mp3方法
- api 二次 开发 禅道_禅道 Rest API 开发
- CES2014盘点:九大穿戴式设备
- iOS 渐变色 以及 镂空效果的实现(Mask的妙用)以及镂空文字的实现
- CSDN-markdown语法之怎样使用LaTeX语法编写数学公式
- The bean ‘XXX‘ could not be injected because it is a JDK dynamic proxy
- 手把手系列之四十七—手把手教你做奶白鲫鱼汤
热门文章
- 计算机怎么取消脱敏设置,一种敏感数据自适应的脱敏方法、系统技术方案
- Divide and Sum CodeForces - 1445D(排列组合+逆元)
- Most Unstable Array CodeForces - 1353A(数学+贪心+建设性算法)
- 网络编程-TCP/IP协议栈-TCP协议
- 反转字符串中的单词 III leetcode
- ffmpeg加环境变量
- 思维--找规律--Codeforces Round #645 (Div. 2) c题
- CF1156F. Card Bag
- 牛客每日一题3.31 城市网络 树上倍增
- [WC2018]州区划分(FWT_OR卷积)