随笔 - 2  文章 - 721  评论 - 6  阅读 - 35万

文章分类 -  Java Concurrency

1 2 下一页
stampLock
摘要:所有获取锁的方法,都返回一个邮戳(Stamp:一个long变量,用cas进行递增),Stamp为0表示获取失败,其余都表示成功 所有释放锁的方法,都需要一个邮戳(Stamp),这个Stamp必须是和成功获取锁时得到的Stamp一致 StampedLock是不可重入的;(如果一个线程已经持有了写锁,再 阅读全文
posted @ 2022-04-23 07:45 溪水静幽 阅读(71) 评论(0) 推荐(0) 编辑
ReadWriteLock缓存
摘要:读写锁使用原则: 一个共享变量允许同时被多个读线程读取到 一个共享变量在同一时刻只能被一个写线程进行写操作 一个共享变量在被写线程执行写操作时,这个共享变量不能被读线程执行读操作 在读写锁中,读锁调用newCondition()会抛出UnsupportedOperationException异常,读 阅读全文
posted @ 2022-04-20 13:52 溪水静幽 阅读(21) 评论(0) 推荐(0) 编辑
CPU 多级缓存-缓存一致性协议MESI
摘要:MESI协议的作用:用于保证多个CPU Cache之间缓存共享数据的一致 MESI 是指4中状态的首字母。每个Cache line有4个状态,可用2个bit表示,它们分别是: 注: 缓存行(Cache line):缓存存储数据的单元。 阅读全文
posted @ 2021-09-13 22:56 溪水静幽 阅读(107) 评论(0) 推荐(0) 编辑
AbstractQueuedSynchronizer
摘要:AbstractQueuedSynchronizer用来构建锁或者其他同步组件的基础框架,使用一个volatile修饰的int成员变量表示同步状态,通过内置的FIFO队列来完成资源获取线程的排队工作。 同步器的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理同步状态,在抽象方法的实现过 阅读全文
posted @ 2020-11-22 18:35 溪水静幽 阅读(29) 评论(0) 推荐(0) 编辑
线程池中如何确定线程的数目
摘要:Nthreads=Ncpu*(1+w/c) IO密集型:如果存在IO,那么肯定w/c>1(阻塞耗时一般是计算耗时的很多倍),但是需要考虑系统内存有限(每开启一个线程都需要内存空间),这里需要上服务器测试具体多少个线程数适合(CPU占比、线程数、总耗时、内存消耗)。如果不想去测试,保守点取1即,Nth 阅读全文
posted @ 2018-11-26 18:31 溪水静幽 阅读(2099) 评论(0) 推荐(0) 编辑
Callable和Future
摘要:当我们需要获取线程的执行结果时,就需要用到它们。Callable用于产生结果,Future用于获取结果。 Callable Callable 是一个接口,包含一个call()方法。Callable是一个返回结果并且可能抛出异常的任务。 为了便于理解,可以将Callable比作一个Runnable接口 阅读全文
posted @ 2018-10-17 17:46 溪水静幽 阅读(145) 评论(0) 推荐(0) 编辑
PriorityBlockingQueue详解
摘要:PriorityBlockingQueue是带优先级的无界阻塞线程安全队列,每次出队返回优先级最高的元素,是二叉树最小堆的实现,队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。 队列中的元素必须是可比较的,即实现Comparab 阅读全文
posted @ 2018-10-14 22:55 溪水静幽 阅读(557) 评论(0) 推荐(0) 编辑
ConcurrentLinkedQueue
摘要:ConcurrentLinkedQueue是非阻塞线程安全的队列,适用于“高并发”的场景。是一个基于链接节点的无界线程安全队列,按照 FIFO(先进先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外) ConcurrentLinkedQueue的数据结构,如下图所示: 阅读全文
posted @ 2018-10-12 15:21 溪水静幽 阅读(3095) 评论(0) 推荐(0) 编辑
LinkedBlockingDeque
摘要:LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);该阻塞队列是支持线程安全。 此外,LinkedBlockingDeque还是可选容量的(防止过度膨胀),即可以指定队列的容量。如果不指 阅读全文
posted @ 2018-10-12 11:34 溪水静幽 阅读(577) 评论(0) 推荐(0) 编辑
ConcurrentHashMap(1.8)
摘要:JDK1.8的实现已经摒弃Segment的概念,而是直接用Node数组+链表+红黑树的数据结构来实现,并发控制使用Synchronized和CAS来操作,整个看起来就像是优化过且线程安全的HashMap,虽然在JDK1.8中还能看到Segment的数据结构,但是已经简化了属性,只是为了兼容旧版本 基 阅读全文
posted @ 2018-10-11 17:32 溪水静幽 阅读(220) 评论(0) 推荐(0) 编辑
CopyOnWriteArraySet
摘要:线程安全的无序的集合,可以理解成线程安全的Hashset。有意思的是,CopyOnWriteArraySet和HashSet虽然都继承于共同的父类AbstractSet;但是,HashSet是通过“HashMap)”实现的,而CopyOnWriteArraySet则是通过“CopyOnWriteAr 阅读全文
posted @ 2018-10-09 17:31 溪水静幽 阅读(453) 评论(0) 推荐(0) 编辑
Condition
摘要:通过Condition能够精细的控制多线程的休眠与唤醒。 对于一个锁,我们可以为多个线程间建立不同的Condition。 通过Condition能够精细的控制多线程的休眠与唤醒。 对于一个锁,我们可以为多个线程间建立不同的Condition。 Condition的具体实现类是AQS的内部类Condi 阅读全文
posted @ 2018-10-07 11:15 溪水静幽 阅读(191) 评论(0) 推荐(0) 编辑
非公平锁
摘要:“公平锁”在每次尝试获取锁时,是采用公平策略(根据等待队列依次排序等待);而“非公平锁”在每次尝试获取锁时,是采用的非公平策略(无视等待队列,直接尝试获取锁,如果锁是空闲的,即可获取状态,则获取锁)。 lock() lock()在ReentrantLock.java的NonfairSync类中实现, 阅读全文
posted @ 2018-10-06 12:05 溪水静幽 阅读(119) 评论(0) 推荐(0) 编辑
LinkedBlockingQueue
摘要:LinkedBlockingQueue是一个单向链表实现的阻塞队列。该队列按 FIFO(先进先出)排序元素,新元素插入到队列的尾部,并且队列获取操作会获得位于队列头部的元素。LinkedBlockingQueue内部分别使用了takeLock 和 putLock 对并发进行控制,也就是说,添加和删除 阅读全文
posted @ 2018-10-05 22:26 溪水静幽 阅读(147) 评论(0) 推荐(0) 编辑
synchronized实现原理
摘要:Synchronized的作用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改能够及时可见(3)有效解决重排序问题。 通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的: public class SynchronizedDemo { public v 阅读全文
posted @ 2018-10-03 09:16 溪水静幽 阅读(145) 评论(0) 推荐(0) 编辑
ReentrantLock公平锁
摘要:ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”。 ReentrantLock锁在同一个时间点只能被一个线程锁持有;而可重入的意思是,ReentrantLock锁,可以被单个线程多次获取。ReentrantLock分为“公平锁”和“非公平锁”。区别体现在获取锁的机制上是否公平。“锁 阅读全文
posted @ 2018-10-02 17:09 溪水静幽 阅读(618) 评论(0) 推荐(0) 编辑
自旋锁、排队自旋锁、MCS锁、CLH锁
摘要:自旋锁(SPIN LOCK) 自旋锁是指当一个线程尝试获取某个锁时,如果该锁已被其他线程占用,就一直循环检测锁是否被释放,而不是进入线程挂起或睡眠状态。 自旋锁适用于锁保护的临界区很小的情况,临界区很小的话,锁占用的时间就很短。 简单的实现 SpinLock里有一个owner属性持有锁当前拥有者的线 阅读全文
posted @ 2018-10-02 16:46 溪水静幽 阅读(188) 评论(0) 推荐(0) 编辑
wait() notify() yield() sleep() join()
摘要:Object类中关于等待/唤醒的API详细信息如下:notify() -- 唤醒在此对象监视器上等待的单个线程。notifyAll() -- 唤醒在此对象监视器上等待的所有线程。wait() -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notify 阅读全文
posted @ 2018-09-29 19:15 溪水静幽 阅读(112) 评论(0) 推荐(0) 编辑
多线程综述
摘要:线程状态图 说明:线程共包括以下5种状态。1. 新建状态(New) : 线程对象被创建后,就进入了新建状态。例如,Thread thread = new Thread()。2. 就绪状态(Runnable) : 被称为“可执行状态”。线程对象被创建后,其它线程调用该对象的start()方法,从而来启 阅读全文
posted @ 2018-09-29 16:03 溪水静幽 阅读(88) 评论(0) 推荐(0) 编辑
HashMap源码
摘要:HashMap采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,大大减少了查找时间。 链表的实现 Node是HashMap的一个内部类,实现Map.Entry接口,本质就是一个映射(键值对)。上图中每个黑色圆点就是一个Node对象。来看具体代码: /** node是单向链表 阅读全文
posted @ 2018-09-29 15:42 溪水静幽 阅读(136) 评论(0) 推荐(0) 编辑

1 2 下一页
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示