摘要: CyclicBarrier CyclicBarrier,一个同步辅助类,在API中是这么介绍的: 它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。 其内部实现使用了Re 阅读全文
posted @ 2018-09-25 20:07 一把水果刀 阅读(127) 评论(0) 推荐(0) 编辑
摘要: ReentrantReadWriteLock 重入锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,但是在大多数场景下,大部分时间都是提供读服务,而写服务占有的时间较少。然而读服务不存在数据竞争问题,如果一个线程在读时禁止其他线程读势必会导致性能降低。所以就提供了读写锁 阅读全文
posted @ 2018-09-25 20:06 一把水果刀 阅读(149) 评论(0) 推荐(0) 编辑
摘要: ReentrantLock 可重入锁 ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。 公平锁与非公平锁 ReentrantLoc 阅读全文
posted @ 2018-09-25 20:05 一把水果刀 阅读(395) 评论(0) 推荐(0) 编辑
摘要: CAS (Compare And Swap) (compare and swap, CAS),是原子操作的一种。整个AQS同步组件、Atomic原子类操作等等都是以CAS实现的,甚至ConcurrentHashMap在1.8的版本中也调整为了CAS+Synchronized。可以说CAS是整个JUC 阅读全文
posted @ 2018-09-25 20:04 一把水果刀 阅读(273) 评论(0) 推荐(0) 编辑
摘要: ASQ(AbstractQueuedSynchronizer)队列同步器 虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁,且它为独占式在高并发场景下性能大打折扣。而ASQ,队列同步器是构建锁或者其他同步组件 阅读全文
posted @ 2018-09-25 20:03 一把水果刀 阅读(960) 评论(0) 推荐(0) 编辑
摘要: Double Check Lock(DCL) 通过单例模式生产类是程序员必会,它有很多写法,其中的懒汉式,及延迟生成类,应使用双重检查,否则就会出现生成多例: public class Singleton { private static Singleton singleton; private S 阅读全文
posted @ 2018-09-25 20:02 一把水果刀 阅读(3026) 评论(0) 推荐(1) 编辑
摘要: volatile关键字 synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。 计算机在运行程序时, 阅读全文
posted @ 2018-09-25 20:00 一把水果刀 阅读(134) 评论(0) 推荐(0) 编辑
摘要: synchronized的分析与使用 同步 机制: synchronized是Java同步机制的一种实现,即互斥锁机制,它所获得的锁叫做互斥锁 互斥锁: 指的是每个对象的锁一次只能分配给一个线程,同一 时间只能由一个线程占用 作用: synchronized用于保证同一时刻只能由一个线程进入到临界区 阅读全文
posted @ 2018-09-14 17:18 一把水果刀 阅读(149) 评论(0) 推荐(0) 编辑
摘要: Java内存模型 重排序 在执行程序时,为了提供性能,编译器会对指令进行重排序。也就是说,一段程序并不是如你所看到的重上至下的顺序执行的。 但是也不会是随意排序的, 它会满足一下两个条件: 1.在单线程环境下不能改变程序运行的结果; 2.存在数据依赖关系的不允许重排序 as-id-serial as 阅读全文
posted @ 2018-09-14 17:17 一把水果刀 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 线程通信机制 目前有两种方式: 1、共享内存--java中使用 2、消息传递(actor 模型) 共享内存: 共享内存这种方式比较常见,我们经常会设置一个共享变量。然后多个线程去操作同一个共享变量。从而达到线程通讯的目的。例如,我们使用多个线程去执行页面抓取任务,我们可以使用一个共享变量count来 阅读全文
posted @ 2018-09-14 17:14 一把水果刀 阅读(776) 评论(0) 推荐(0) 编辑