一、高并发同步锁

(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 并发总结——高并发与同步锁相关推荐

  1. 【java】动态高并发时为什么推荐重入锁而不是Synchronized?

    1.概述 转载:http://www.dreamwu.com/post-1758.html 这个图画的不错,有助于加深理解. [Java]Synchronized 有几种用法 [java] 从hots ...

  2. java设计模式并发_[高并发Java 七] 并发设计模式

    [高并发Java 七] 并发设计模式 [高并发Java 七] 并发设计模式 为什么80%的码农都做不了架构师?>>> 在软件工程中,设计模式(design pattern)是对软件设 ...

  3. 如何掌握java多线程,高并发,大数据方面的技能?

    https://www.zhihu.com/question/27575123 如何掌握java多线程,高并发,大数据方面的技能? 因为想进入互联网公司,然后发现互联网类型的公司问的主要问题都离不开这 ...

  4. 总结-Java多线程与高并发简记

    1.什么是多线程? 一个进程可以开启多个线程,每个线程可以并发/并行执行不同任务. 2.Java多线程实现方式    2.1.继承Thread类    2.2.实现Runnable接口方式实现多线程 ...

  5. 网站高并发及高并发架构详解

    高并发是指在同一个时间点,有很多用户同时的访问URL地址,比如:淘宝的双11,双12,就会产生高并发,如贴吧的爆吧,就是恶意的高并发请求,也就是DDOS攻击,再屌丝点的说法就像玩撸啊撸被ADC暴击了一 ...

  6. oom 如何避免 高并发_【高并发】高并发环境下如何防止Tomcat内存溢出?看完我懂了!!...

    [高并发]高并发环境下如何防止Tomcat内存溢出?看完我懂了!! 发布时间:2020-04-19 00:47, 浏览次数:126 , 标签: Tomcat 写在前面 随着系统并发量越来越高,Tomc ...

  7. 慕课网高并发实战(一)-并发与高并发基本概念

    课程网址 并发: 同时拥有两个或者多个线程,如果程序在单核处理器上运行,多个线程交替得换入或者换出内存,这些线程是同时"存在"的,每个线程都处于执行过程中的某个状态,如果运行在多核 ...

  8. java 高并发_Java 高并发之无锁(CAS)

    Java 高并发之无锁(CAS) 本篇主要讲 Java中的无锁 CAS ,无锁 顾名思义就是 以不上锁的方式解决并发问题,而不使用synchronized 和 lock 等.. 1. Atomic 包 ...

  9. Java 并发:第三部分 - 同步锁

    2019独角兽企业重金招聘Python工程师标准>>> 在学完如何创建线程和管理他们之后,是时候进入最重要的部分:同步. 同步是壹种让代码线程安全的方式.可以被多個线程访问的代码必须 ...

最新文章

  1. ul li设置横排,并除去li前的圆点
  2. 利用UIWebView获取userAgent需要注意的地方
  3. SqlServer 获取汉字的拼音首字母
  4. 精度问题——直线方程的系数判断实际生产中三点能否确定一个圆
  5. 我的创业分享 之 不要轻易选择创业
  6. window下的SCROLLbar的使用技巧
  7. 【译】区块链是如何工作的——用JavaScript演示
  8. 家用工具套装_居家生活必不可少的8款五金工具,便宜又实用
  9. 第一次 Zul'grub
  10. SQL Server查询数据库执行记录
  11. win7系统电脑连接小米蓝牙音箱
  12. 35岁,你要逃离北上广?
  13. 2. 确定地球与金星之间的距离 天文学家在1914年8月份的7次观测中,测得地球与金星之间距离(单位:米),并取其常用对数值,与日期的一组历史数据如下表:
  14. flac转换成mp3,flac转mp3方法
  15. api 二次 开发 禅道_禅道 Rest API 开发
  16. CES2014盘点:九大穿戴式设备
  17. iOS 渐变色 以及 镂空效果的实现(Mask的妙用)以及镂空文字的实现
  18. CSDN-markdown语法之怎样使用LaTeX语法编写数学公式
  19. The bean ‘XXX‘ could not be injected because it is a JDK dynamic proxy
  20. 手把手系列之四十七—手把手教你做奶白鲫鱼汤

热门文章

  1. 计算机怎么取消脱敏设置,一种敏感数据自适应的脱敏方法、系统技术方案
  2. Divide and Sum CodeForces - 1445D(排列组合+逆元)
  3. Most Unstable Array CodeForces - 1353A(数学+贪心+建设性算法)
  4. 网络编程-TCP/IP协议栈-TCP协议
  5. 反转字符串中的单词 III leetcode
  6. ffmpeg加环境变量
  7. 思维--找规律--Codeforces Round #645 (Div. 2) c题
  8. CF1156F. Card Bag
  9. 牛客每日一题3.31 城市网络 树上倍增
  10. [WC2018]州区划分(FWT_OR卷积)