并发编程与锁
文章平均质量分 93
一个小码农
乘风破BUG
别crud了
展开
-
并发容器之ConcurrentHashMap详解
文章目录ConcurrentHashMap的关键属性 ConcurrentHashMap的关键属性 table volatile Node<K,V>[] table; 装载Node的数组,作为ConcurrentHashMap的数据容器,采用懒加载的方式,直到第一次插入数据的时候才会进行初始化操作,数组的大小总是为2的幂次方。 nextTable volatile Node<K,V>[] nextTable; 扩容时使用,平时为null,只有在扩容时才为非null. sizeCtl原创 2021-01-22 00:13:15 · 1122 阅读 · 1 评论 -
阻塞队列(XXXQueue)
文章目录阻塞情况常用方法ArrayBlockingQueue(公平,非公平)LinkedBlockingQueue(两个独立锁提高并发)PriorityBlockingQueue(comPareTo 排序实现优先)DelayQueue(缓存失效,定时任务)SynchronousQueue(不存储数据,可用于传递数据)LinkedTransferQueue 阻塞情况 在阻塞队列中,队列阻塞有这样的两种情况: 当队列中没有数据的情况下,消费者端的所有线程都会被自动阻塞(挂起),直到有数据放入队列; 当队列中填原创 2021-01-04 14:49:16 · 238 阅读 · 0 评论 -
原子类(Atomicxxx)和原子集合(CopyOnWritexxx,Concurrentxxx)
文章目录原子操作类简介什么是CAS?CAS的操作过程Synchronized VS CASCAS的问题原子类AtomicLongAtomicIntegerArray 原子操作类简介 在并发编程中很容易出现并发安全的问题,有一个很简单的例子就是多线程更新变量i=1,比如多个线程执行i++操作,就有可能获取不到正确的值,而这个问题,最常用的方法是通过Synchronized进行控制来达到线程安全的目的(关于synchronized可以看这篇文章)。但是由于synchronized是采用的是悲观锁策略,并不是特别原创 2021-01-04 11:54:54 · 855 阅读 · 0 评论 -
并发工具之Semaphore与Exchanger
文章目录控制资源并发访问Semaphore线程间交换数据的工具Exchanger 控制资源并发访问Semaphore Semaphore可以理解为信号量,用于控制资源能够被并发访问的线程数量,以保证多个线程能够合理的使用特定资源。Semaphore就相当于一个许可证,线程需要先通过acquire方法获取该许可证,该线程才能继续往下执行,否则只能在该方法处阻塞等待。当执行完业务功能后,需要通过release()方法将许可证归还,以便其他线程能够获得许可证继续执行。 Semaphroe可以用于流量控制,特别是在原创 2020-12-31 17:12:48 · 152 阅读 · 0 评论 -
Java的并发关键字
文章目录Java并发关键字-synchronized实现原理对象锁(monitor)机制synchronized的happens-before关系锁获取和锁释放的内存语义synchronized优化CAS操作 Java并发关键字-synchronized Java关键字synchronized具有使每个线程一次排队操作共享变量的功能,很显然,这种同步机制效率很低,但synchronized是其他并发容器实现的基础。 实现原理 使用场景: tip: synchronized可以用在方法上也可以使用在代码块原创 2020-12-31 14:53:19 · 1118 阅读 · 1 评论 -
CAS/AQS
文章目录CAS原理实现CAS中得经典问题,ABA问题AQS原理(state资源状态计数)资源共享的方式实现方式 CAS CAS函数,是比较并交换函数,它是原子操作函数 原理 CAS是基于乐观锁的原理进行操作的。它总是认为自己可以成功完成操作。当多个线程同时使用CAS时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仍是被告知失败,并且允许再次尝试或放弃操作。 实现 构造:CAS包含3个参数CAS(V,E,N)。V表示要更新的变量(内存值),E表示预期值(旧的),N表示新值; 比较并交换:原创 2020-12-23 16:55:10 · 169 阅读 · 0 评论 -
JAVA中常见的锁简单介绍
文章目录独享锁(互斥锁)/共享锁(读写锁)独享锁共享锁可重入锁(递归锁)公平锁/非公平锁偏向锁/轻量级锁/重量级锁自旋锁适应性自旋锁锁的优化应用优化JVM优化 独享锁(互斥锁)/共享锁(读写锁) 独享锁 定义:独享锁是指该锁一次只能被一个线程所持有; 特点:独占锁是一种悲观保守的加锁策略,他避免了读/读冲突,如果某个只读线程获取锁,则其他读线程都只能等待,这种情况下就限制了不必要的并发性,因为读操作并不会影响数据的一致性。 引用:ReentrantLock就是以独占方式实现的互斥锁。 共享锁 定义:共原创 2020-12-23 16:22:23 · 110 阅读 · 0 评论 -
乐观锁和悲观锁
乐观锁 前提:认为读多写少,遇到并发写的可能性低,每次去拿数据的时候都认为别人不会修改,所以不会上锁; 实现:在更新的时候会判断以下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。 应用:在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap【比较并交换】)实现的。CAS是一种更新的原子操作,比较当前值跟传原创 2020-12-23 15:24:50 · 233 阅读 · 0 评论
分享