CAS

Synchronized 与 ReentrantLock 的区别!

强颜欢笑 提交于 2020-04-28 16:17:27
作者:jason cnblogs.com/baizhanshi/p/7211802.html 之前栈长分享了重入锁的概念:《 到底什么是重入锁,拜托,一次搞清楚! 》,今天现来深入了解下 Synchronized 与 ReentrantLock 的区别! 可重入性: 从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。 两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 锁的实现: Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用户自己敲代码实现的区别。前者的实现是比较难见到的,后者有直接的源码可供阅读。 性能的区别: 在Synchronized优化以前,synchronized的性能是比ReenTrantLock差很多的,但是自从Synchronized引入了偏向锁,轻量级锁(自旋锁)后,两者的性能就差不多了。 在两种方法都可用的情况下,官方甚至建议使用synchronized,其实synchronized的优化我感觉就借鉴了ReenTrantLock中的CAS技术。都是试图在用户态就把加锁问题解决,避免进入内核态的线程阻塞。 功能区别: 便利性

031.[转] 从类状态看Java多线程安全并发

不想你离开。 提交于 2020-04-28 11:59:40
从类状态看Java多线程安全并发 pphh 发布于 2018年9月16日 对于Java开发人员来说,i++的并发不安全是人所共知,但是它真的有那么不安全么? 在开发Java代码时,如何能够避免多线程并发出现的安全问题?这是所有Java程序员都会面临的问题。本文讲述了在开发Java代码时安全并发设计所需要考虑的点,文中以一张图展开,围绕着Java类状态,讨论各种情况下的并发安全问题。当理解了Java类的各种变量状态在并发情况下的表现,在写Java多线程代码时就可以做到心中有数,游刃有余,写出更加安全、健壮、灵活的多线程并发代码。 目录 1. 多线程并发简介 2. 从类状态看Java安全并发 3. Java安全并发分解 3.1 无状态类 3.2 有状态类 3.3 私有状态类 3.4 共享状态类 3.5 不可变状态类(常量状态) 3.6 可变状态类 3.7 非阻塞设计 3.8 阻塞设计 3.8.1 资源死锁(resource deadlock) 3.8.2 锁顺序死锁(lock-ordering deadlock) 3.8.3 状态公开 4. 类的静态状态 5. 类外部状态和多线程安全并发 6. 小结 7. 演示代码 8. 参考资料 1. 多线程并发简介 在现代操作系统中,CPU的调度都是以线程为基本单位,各个线程各自独立获取到CPU时间片并执行代码指令,这就是多线程并发。于此同时

Java多线程对象及变量的并发访问

社会主义新天地 提交于 2020-04-28 11:20:59
目录: <a href='#1'>synchronized总结</a> <a href='#2'>写一个死锁</a> <a href='#3'>线程安全的三大特性</a> <a href='#4'>java内存模型</a> <a href='#5'>synchronized与volatile对比</a> <a href='#6'>Atomic原子类</a> <a href='#7'>CAS机制(compare and swap)</a> <a href='#8'>乐观锁悲观锁</a> 1、<herf name='1'>synchronized </a> 1.1、方法内的变量为线程安全的 “非线程安全”问题存在于实例变量中,如果一个变量是方法内的变量,那么这个变量是线程安全的,也不会出现“非线程安全”问题。 代码: package Thread.thread2; public class Num { //private int num; public void addI(String str){ int num =0; if(str.equals("a")){ num=100; System.out.println("a set over"); try { Thread.sleep(2000); } catch (InterruptedException e) { e

Laravel 从入门到精通系列教程

微笑、不失礼 提交于 2020-04-28 04:34:18
转载;https://laravelacademy.org/laravel-tutorial-5_7 适用于 Laravel 5.5、5.6、5.7 版本,本系列教程将围绕一个 LTS 版本,然后采取增量更新方式,随着 Laravel 版本的升级不断进行更新,直到 Laravel 框架不再维护。比如这个教程是在 Laravel 5.5 教程的基础上,涵盖 5.6、5.7 版本的功能。 有人会问这个教程和官方文档有什么区别, 文档相对晦涩, 很多地方会让新手云里雾里, 且各章节相互独立、松散,你可以将本系列教程看作一本针对 Laravel 的、开放式的、持续更新的、以实例驱动的、深入浅出的非官方实战指南。 本系列教程源码存放在 Github 上: https://github.com/nonfu/laravel-tutorial-code 更新频率:为保证教程质量,每周一、三、五更新。 一、预备篇 PHP 知识储备 Composer 命名空间 Trait 闭包和匿名函数 搭建开发环境 基于 Vagrant + Virtual Box 构建本地开发环境:Homestead(适用于全平台) (Windows 平台安装还可以参考 这篇教程 ) 基于 Docker 构建本地开发环境:Laradock(适用于全平台) 适用于 Mac 的轻量级开发环境:Laravel Valet 适用于

ReentrantLock 源码分析

巧了我就是萌 提交于 2020-04-27 21:31:01
前言 前面用了 4 篇文章为本文分析 ReentrantLock 源码做了一些铺垫, ReentrantLock 源码分析 - 基础知识篇 ReentrantLock 源码分析 - 并发基础类 ReentrantLock 源码分析 - AbstractQueuedSynchronizer 详解(一) ReentrantLock 源码分析 - AbstractQueuedSynchronizer 详解(二) 赶紧趁热打铁,来看下 ReentrantLock 非公平锁的 lock() 方法是如何实现的。 正文 知识回顾 ReentrantLock 既可以实现非公平锁,也可以实现公平锁。 通过 ReentrantLock lock = ReentrantLock(false) 的方式可以创建一个非公平锁。 public ReentrantLock(boolean fair) { sync = fair ? new FairSync() : new NonfairSync(); } 从上面的构造方法可以看出, 当传入 false 时,new 了个 NonfairSync 对象。 NonfairSync 类 通过查看源码,可以看出 NonfairSync 继承 Sync 。 那 Sync 又是什么? 请往后看。 static final class NonfairSync extends

《Java面试全解析》1000道面试题大全详解

给你一囗甜甜゛ 提交于 2020-04-27 19:07:58
《Java面试全解析》1000道面试题大全详解 本人是 2009 年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有 360 和游久游戏,因为自己家庭的原因,放弃了阿里钉钉团队的 offer 回到了西安。 从 2015 年四月开始在一家上市公司担任研发经理的职位,至今也快 5 年了,一路上见了很多也面试了很多人技术人,大部分面试的结果很令我沮丧,这也是我出这本书的原因之一,帮助更多的人搞懂技术最核心的知识。 为了写好这个专栏内容,我先后拜访了一二十家互联网公司,与不同的面试官和面试者进行面对面探讨,深入了解了企业对于面试者的要求和常见的 Java面试题 型。之后我花了大半年的时间,结合自己 4 年多作为面试官的经历,把这些内容整理成文,用大约 15 万字的内容对 Java 的核心知识点和常见的 1000多道面试题,做了详细的介绍,也就是本专栏中你所看到的全部内容,希望对你能有所帮助。 为什么要学这个专栏内容? 「因为它能为你赢得面试的主动权,让你获得更好的 Offer。」 从业十多年,我从面试者变成面试官,在 Java 面试上积累了比较丰富的经验。 其实,很多面试者在搜集面试资料的时候都踩过一些“坑”,你是不是也遇到过: 免费搜索的面试题,内容 不全面 ,这就算了,有时候答案都 不准确 ; 很多培训机构提供的面试宝典内容虽然不少,但 深度不够 ,且面试题

《Java面试全解析》1000道面试题大全详解(转)

烈酒焚心 提交于 2020-04-27 19:05:40
《Java面试全解析》1000道 面试题 大全详解 本人是 2009 年参加编程工作的,一路上在技术公司摸爬滚打,前几年一直在上海,待过的公司有 360 和游久游戏,因为自己家庭的原因,放弃了阿里钉钉团队的 offer 回到了西安。 从 2015 年四月开始在一家上市公司担任研发经理的职位,至今也快 5 年了,一路上见了很多也面试了很多人技术人,大部分面试的结果很令我沮丧,这也是我出这本书的原因之一,帮助更多的人搞懂技术最核心的知识。 为了写好这个专栏内容,我先后拜访了一二十家互联网公司,与不同的面试官和面试者进行面对面探讨,深入了解了企业对于面试者的要求和常见的 Java面试题 型。之后我花了大半年的时间,结合自己 4 年多作为面试官的经历,把这些内容整理成文,用大约 15 万字的内容对 Java 的核心知识点和常见的 1000多道面试题,做了详细的介绍,也就是本专栏中你所看到的全部内容,希望对你能有所帮助。 为什么要学这个专栏内容? 「因为它能为你赢得面试的主动权,让你获得更好的 Offer。」 从业十多年,我从面试者变成面试官,在 Java 面试上积累了比较丰富的经验。 其实,很多面试者在搜集面试资料的时候都踩过一些“坑”,你是不是也遇到过: 免费搜索的面试题,内容 不全面 ,这就算了,有时候答案都 不准确 ; 很多培训机构提供的面试宝典内容虽然不少,但 深度不够 ,且面试题

2020年最鲜出炉 一线互联网公司Java高级面试题总结(含解析)

眉间皱痕 提交于 2020-04-27 13:07:04
不管是开发、测试、运维,每个技术人员心里都有一个成为技术大牛的梦,毕竟“梦想总是要有的,万一实现了呢”! 正是对技术梦的追求,促使我们不断地努力和提升自己。 今天分享Java重点面试知识 : 多线程(线程状态、线程并发,Synchronized与Lock的区别和底层原理,常用的锁及其使用场景和原理, volatile和ThreadLocal解决了什么问题,CAS在Java中的实现 线程池原理和实现,阻塞队列和线程安全队列, **线程间通信:**synchronized + wait、notify/notifyAll, Lock + Condition 的多路复用, CountDownLatch、CyclicBarrier和Semaphore的作用和用法,使用场景) JVM内存管理机制和垃圾回收机制 (内存模型、GC策略、算法、分代回收GC类型,Full GC、Minor GC作用范围和触发条件) JVM内存调优 (内存调整的6个参数,了解是怎么回事,一般做项目过程中使用较多) 设计模式(熟悉常见设计模式的应用场景,会画类图,常用:代理,2个工厂,策略,单例,观察者,适配器,组合与装饰) ** JAVA集合类框架(理解框架图、HashMap、ArrayList、HashSet等的关系和区别,其中HashMap的存储机制几乎每次都有问)** HashMap的原理,底层数据结构

CAS 理解以及总结

徘徊边缘 提交于 2020-04-27 02:21:15
简介 CAS(compare and swap) 即“比较”和“交换”,主要为了解决在多线程并发情况下,使用锁造成的性能消耗问题。在高效、不加锁的情况下,能够以原子性的行为实现数据的操作。一般系统层面都在硬件层次上直接支持CAS指令,而高级语言一般都会直接利用这些指令。 java中的CAS 在 java.util.concureent.atomic 包中拥有大量的原子类,他们都是利用了CAS来完成原子性操作。需要关注的就是它们共同都拥有的一个函数 compareAndSet(expect,update) public final boolean compareAndSet(int expect, int update) { return unsafe.compareAndSwapInt(this, valueOffset, expect, update); } 以 AtomicInteger 类中的 compareAndSet 函数为例,其他各个原子类的 compareAndSet 函数差异不大。最后调用的都是 unsafe.compareAndSwapInt 函数或者 unsafe.compareAndSwapObject 只不过一个是数值一个是引用类型而已。 compareAndSet函数 这个函数总共有两个参数, expect 和 update ,第一个代表期望值

JVM总结-synchronized

杀马特。学长 韩版系。学妹 提交于 2020-04-26 22:50:42
在 Java 程序中,我们可以利用 synchronized 关键字来对程序进行加锁。它既可以用来声明一个 synchronized 代码块,也可以直接标记静态方法或者实例方法。 synchronized是利用锁(对象锁,类锁)的机制来实现同步的。 锁机制有如下两种特性: 互斥性: 即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的 原子性 。 可见性: 必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致。 Synchronized原理分析 线程堆栈分析(互斥) Jconsole 当声明 synchronized 代码块时,编译而成的字节码将包含 monitorenter 和 monitorexit 指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是 synchronized 关键字括号里的引用),作为所要加锁解锁的锁对象。 public void foo(Object lock) { synchronized (lock) { lock.hashCode(); } } // 上面的 Java 代码将编译为下面的字节码