锁
xiaoliuliu2050
这个作者很懒,什么都没留下…
展开
-
java多线程协作方法之 wait notify condition 的理解
java 多线程协作肯定因为共享对象,实现原理是基于线程挂起和线程恢复。wait notify condition 都是 基于锁对象产生的衍生方法,多线程之间可以依靠这些方法实现线程协作。synchronized 的锁原理是在共享对象头里添加标记和对象监控器,这些都是jvm 内部实现的。而 lock 的锁原理是 独立于共享对象之外 新建一个锁监控对象(锁对象就类似于synchroniz...原创 2018-12-18 11:16:13 · 446 阅读 · 0 评论 -
AbstractQueuedSynchronizer(AQS) 源码详解
这个系列文章打算用图解的方式记录了自己阅读concurrent包的中一些类的大概流程,加深印象。JDK版本我这里依据的JDK版本如下:java version "1.8.0_73"Java(TM) SE Runtime Environment (build 1.8.0_73-b02)Java HotSpot(TM) 64-Bit Server VM (build 25.73-b0...转载 2018-12-26 13:34:26 · 300 阅读 · 0 评论 -
java保证多线程安全的一种机制 : volatile 关键字
有时仅仅为了读写一个或者两个实例域就使用同步的话,显得开销过大,volatile关键字为实例域的同步访问提供了免锁的机制。如果声明一个域为volatile,那么编译器和虚拟机就知道该域是可能被另一个线程并发更新的。volatile 关键字的使用场景:多线程环境中,只共享一个标志位。 如果线程A 修改了这个标志位,需要线程B能够及时获取到更新的值,这种情况下要使用volatile关键字。如果...转载 2018-12-26 15:36:27 · 739 阅读 · 0 评论 -
java 锁和内存重排序
指令重排导致单例模式失效我们都知道一个经典的懒加载方式的单例模式:public class Singleton {private static Singleton instance = null;private Singleton() { }public static Singleton getInstance() {if(instance == null) {synch...转载 2018-12-26 15:57:18 · 281 阅读 · 0 评论 -
java保证多线程安全的一种机制 : 原子类介绍 atomic
volatile 保证了可见性和有序性 ,不保证原子性,并且没有对变量加锁原子类 对volatile 做了封装,是一种 支持 原子性的 类库,并且没有对变量加锁。他是如何保证原子性呢,他是通过cas 操作和while 循环 来做到的。atomic原子类导图1 原子更新基本类型atomic包提高原子更新基本类型的工具类,主要有这些:AtomicBoolean:以原子...原创 2018-12-26 18:14:06 · 2972 阅读 · 1 评论 -
Java CAS ABA问题发生的场景分析
提到了CAS操作存在问题,就是在CAS之前A变成B又变回A,CAS还是能够设置成功的,什么场景下会出现这个问题呢?查了一些资料,发现在下面的两种情况下会出现ABA问题。 1.A最开始的内存地址是X,然后失效了,有分配了B,恰好内存地址是X,这时候通过CAS操作,却设置成功了 这种情况在带有GC的语言中,这种情况是不可能发生的,为什么呢?拿JAVA举例,在执行CAS操作时,A,B对象...转载 2018-12-26 18:25:38 · 695 阅读 · 0 评论 -
java ReentrantReadWriteLock(读写锁)实现原理深入探究
ReentrantReadWriteLock则是混合了独占共享模式的经典实现。读锁和写锁从一个ReentrantReadWriteLock对象中可以获得两把锁,分别是读锁和写锁,如下: private ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); private Lock readLock = ...转载 2018-12-21 18:45:59 · 253 阅读 · 0 评论 -
Java并发Concurrent技术进化概述
1.JDK1.4及之前在JDK1.4及之前的版本,主要提供的并发技术有:synchronized关键字volatile关键字不变模式 :不变模式,就是指:在并发编程中,为确保数据的一致性和正确性,使用一种不可改变的对象。依靠其不可变的性质,来确保在没有同步的情况下依旧保持一致性和正确性。Java中不变模式相关技术有:final关键字 和String类型常用的工具类 : hashtab...原创 2019-01-03 10:03:03 · 189 阅读 · 0 评论 -
jdk5 juc java并发中的集合类list set map queue概述
1. List和SetJUC集合包中的List实现类:CopyOnWriteArrayListset 实现类 CopyOnWriteArraySet和ConcurrentSkipListSet。(01)CopyOnWriteArrayList相当于线程安全的ArrayList,它实现了List接口。CopyOnWriteArrayList是支持高并发的。(02)Co...原创 2019-01-03 10:02:53 · 272 阅读 · 0 评论 -
java 数据结构之 map 多线程实现 concurrentSkipListMap 源码解析
什么是跳表 :https://blog.csdn.net/xiaoliuliu2050/article/details/73230494Key-Value数据结构目前常用的key-value数据结构有三种:Hash表、红黑树、SkipList,它们各自有着不同的优缺点(不考虑删除操作):Hash表:插入、查找最快,为O(1);如使用链表实现则可实现无锁;数据有序化需要显式的排序操作。红...转载 2019-03-08 17:07:09 · 362 阅读 · 0 评论 -
java 多线程协作 Semaphore 信号量
Semaphore简介Semaphore是一个计数信号量,它的本质是一个"共享锁"。信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。Semaphore的函数列表// 创建具有给定的许可数和非公平的公平设...转载 2017-06-30 15:14:03 · 441 阅读 · 0 评论 -
java ReentrantLock(显示锁-公平锁)实现原理深入探究
ReentrantLock reentrantLock=new ReentrantLock(true);reentrantLock.lock();reentrantLock.unlock();1 reentrantLock.lock() 内部实现final void lock() { acquire(1);}2 acquire(1) 内部实现:public fi...原创 2018-12-20 14:45:28 · 614 阅读 · 0 评论 -
java ReentrantLock(显示锁-非公平锁)实现原理深入探究
前言这篇文章被归到Java基础分类中,其实真的一点都不基础。网上写ReentrantLock的使用、ReentrantLock和synchronized的区别的文章很多,研究ReentrantLock并且能讲清楚ReentrantLock的原理的文章很少,本文就来研究一下ReentrantLock的实现原理。研究ReentrantLock的实现原理需要比较好的Java基础以及阅读代码的能力,有...转载 2018-12-17 18:17:21 · 185 阅读 · 0 评论 -
java 锁之 synchronized, Lock,ReadWriteLock 的比较
在java多线程编程中,可能我们经常会遇到线程同步的问题,可以使用synchronized或者Lock和ReadWriteLock去控制同步锁,他们都能实现线程的同步,下面来分析下这几种方式的区别:1.synchronized它可以锁住一个方法或者一段代码块,伪代码如下://锁住方法public synchronized void test(){ doSomething......原创 2018-12-14 14:14:34 · 243 阅读 · 1 评论 -
java保证多线程安全的一种机制 : 锁
为了保证共享数据在同一时刻只被一个线程使用,我们有一种很简单的实现思想,就是 在共享数据里保存一个锁 ,当没有线程访问时,锁是空的。当有第一个线程访问时,就 在锁里保存这个线程的标识 并允许这个线程访问共享数据。在当前线程释放共享数据之前,如果再有其他线程想要访问共享数据,就要 等待锁释放 。在共享数据里保存一个锁 在锁里保存这个线程的标识 其他线程访问已加锁共享数据要等待锁释...原创 2018-12-12 17:09:17 · 775 阅读 · 0 评论 -
java 如何在代码中优化锁的使用
锁优化以上介绍的锁不是我们代码中能够控制的,但是借鉴上面的思想,我们可以优化我们自己线程的加锁操作;1 减少锁的时间不需要同步执行的代码,能不放在同步快里面执行就不要放在同步快内,可以让锁尽快释放;2 减少锁的粒度它的思想是将物理上的一个锁,拆成逻辑上的多个锁,增加并行度,从而降低锁竞争。它的思想也是用空间来换时间;java中很多数据结构都是采用这种方法提高并发操作的效率:C...原创 2018-12-12 10:46:49 · 334 阅读 · 0 评论 -
java内置锁(synchronized)原理 -- 偏向锁、轻量级锁、自旋锁、重量级锁
锁的基础知识基础知识之一:锁的类型锁从宏观上分类,分为悲观锁与乐观锁。乐观锁乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。java中的乐观锁基...原创 2018-12-11 13:45:31 · 1525 阅读 · 3 评论 -
细粒度 锁 实现
最近在工作上碰见了一些高并发的场景需要加锁来保证业务逻辑的正确性,并且要求加锁后性能不能受到太大的影响。初步的想法是通过数据的时间戳,id等关键字来加锁,从而保证不同类型数据处理的并发性。而java自身api提供的锁粒度太大,很难同时满足这些需求,于是自己动手写了几个简单的扩展... 1. 分段锁 借鉴concurrentHashMap的分段思想,先生成一定数量的锁,具...转载 2017-06-30 13:56:27 · 643 阅读 · 0 评论 -
java多线程协作之CountDownLatch (线程等待其他一个或者多个线程执行完毕之后开始执行)
CountDownLatch简介CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。CountDownLatch和CyclicBarrier的区别(01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。(02) CountDownLatch的计数...转载 2017-06-30 15:09:29 · 539 阅读 · 0 评论 -
多线程协作之 CyclicBarrier (多个线程之间相互等待, 都到了之后继续执行或者另外一个线程开始执行)
CyclicBarrier简介CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。注意比较CountDownLatch和CyclicBarrier:(01) CountDownLatch的作用是允许1或N个线程等待其他线程...转载 2017-06-30 15:12:03 · 471 阅读 · 0 评论 -
java数据结构之并发队列中的阻塞队列 BlockingDeque 接口实现之 LinkedBlockingDeque
1 双向并发阻塞队列。所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表。首先看下LinkedBlockingDeque的数据结构。通常情况下从数据结构上就能看出这种实现的优缺点,这样就知道如何更好的使用工具了。从数据结构和功能需求上可以得到以下结论:要想支持阻塞功能,队列的容...转载 2019-03-07 17:29:29 · 216 阅读 · 0 评论