多线程
不骄不傲
低调人生,从不装逼
展开
-
Java可重入读写锁ReentrantReadWriteLock之实战缓存
简介写一个简单的缓存读写锁demo, 基本操作set和get, set是写锁,get是读锁.反例没加读写锁前的程序执行public class ReadWriteLockDemo { public static void main(String[] args) { for (int i = 0; i < 5; i++) { final int temp = i; new Thread(()->{原创 2020-08-31 22:12:21 · 468 阅读 · 1 评论 -
Java中利用AtomicReference手写自旋锁Demo
自旋锁简介自旋锁是一种非阻塞锁,抢到执行权的线程并不会自旋,自旋的精髓在于没抢到执行权的线程,它们会空转cpu,一直循环,这就是自旋,并非把线程改为阻塞状态.它们还是在运行的,自旋重试想获取锁.源代码public class SpinLockDemo { public static AtomicReference<Thread> spinLock = new AtomicReference<>(); private static Integer count原创 2020-08-27 22:42:50 · 666 阅读 · 1 评论 -
Java中可重入锁synchronized,ReentrantLock简介
可重入锁即可以加锁多次,解锁也可以多次,且加锁解锁次数相抵消才行.synchronized和ReentrantLock都是可重入锁代码案例演示public class ReentrantLockDemo2 { private static ReentrantLock lock = new ReentrantLock(); public static void main(String[] args) { new Thread(()->{原创 2020-08-27 21:37:05 · 207 阅读 · 0 评论 -
简单介绍newFixedThreadPool线程池原理
实现原理底层是采用队列来存储进来的线程,如果工作队列满了无空闲工作线程,则加入队列阻塞,如果工作线程有空闲,则不用阻塞直接被执行.默认是一个无界队列int.MAX_VALUE这么大,如果请求过大会造成JVM内存OOM...原创 2020-08-25 22:10:53 · 611 阅读 · 0 评论 -
简单介绍AQS底层原理
AQS简介全称Abstract Queued Synchronizer, 抽象队列同步器,它是并发包中的基础类,比如ReentrantLock就基于AQS实现可重入锁AQS原理AQS中有state丶临界区线程丶等待队列三个重要部分组成其中线程去CAS更新state为1,更新成功的线程进入代码临界区,其它CAS更新失败的线程进入等待队列临界区线程释放锁后,唤醒等待队列线程.如果此时有其它线程进来CAS更新state为1,那么等待队列线程继续等待,这就是被插队,非公平锁,Java中ReentrantL原创 2020-08-25 21:51:54 · 781 阅读 · 0 评论 -
简单介绍synchronized底层原理
synchronized加锁方式大致三种锁对象锁this指针,当前对象锁类.classsynchronized的原理底层主要是有monitor对象,获取锁时判断标志位是否为0,为0则进入临界区对应的指令monitorenter,获得锁后标志位改为1,其它线程获取锁发现标志位1,进入阻塞状态,直到临界区线程出来是标志位-1变为0对应的指令monitorexit...原创 2020-08-25 21:21:09 · 158 阅读 · 0 评论 -
Java中公平锁和非公平锁各自的特点
公平锁公平锁对于线程来说是先请求先调度执行,即FIFO队列,队列头部第一个线程永远先执行,吞吐量不理想.例如Java中的ReentrantLock可以通过参数改为公平锁,默认是非公平锁.FairSync()实现类公平锁非公平锁非公平锁见名知意,并不是线程先请求就会先被执行,底层是采用某种机制可能是优先权抢占,短线程抢占,来抢锁,好处就是提高了系统的吞吐量,其中短线程抢占算法可能会导致长线程得不到执行产生"饥饿"现象,不过可以采用"老化技术"来解决饥饿问题.总结至于使用什么锁,是需要看使用场原创 2020-08-10 22:30:43 · 518 阅读 · 0 评论 -
Java并发HashMap报错ConcurrentModificationException解决方案
HashMapHashMap是散列表存储,采用key-value键值对存储数据,其中k用hash散列函数找到存储位置,为的就是减少查找比较次数,特点: 无序,key不可重复,key可以为null,value可重复,线程不安全.JDK1.7底层是采用数组+链表,hash碰撞后采用拉链法来解决碰撞问题.JDK1.8底层采用数组+链表+红黑树,链表长度大于等于8且容量大于等于64就会树化,否则会反树化.案例代码public class HashMapConcurrentDemo { public原创 2020-08-09 14:36:00 · 3064 阅读 · 0 评论 -
Java并发HashSet报错ConcurrentModificationException解决方案
HashSetHashSet特点: 元素不可重复,无序,线程不安全,底层是HashMap实现,HashMap的key是唯一不可重复的,value则是用的一个Object对象"占位",主要是key用来存取数据.案例代码public class HashSetConcurrentDemo { public static void main(String[] args) { Set<String> list = new HashSet(); for原创 2020-08-09 14:19:20 · 1676 阅读 · 0 评论 -
Java并发ArrayList报错ConcurrentModificationException解决方案
ArrayListArrayList是一个集合,特点: 有序,元素可重复,随机查找快,删除和插入较慢,线程不安全.默认10个容量大小,底层实现是一个数组和动态扩容技术,扩容时是当前容量的1.5倍,即10*150% = 15.案例代码public class ArrayListConcurrentDemo { public static void main(String[] args) { List<String> list = new ArrayList<原创 2020-08-09 13:58:12 · 525 阅读 · 0 评论 -
Java并发CAS之ABA问题
CAS锁有ABA问题因为CAS是乐观锁,只要预期值和当前值相同则可以修改成功,但是这会有个"ABA"问题.什么是"ABA"问题呢,我上段程序就知道了public class AtomicReferenceDemo { static AtomicReference<Integer> atomicReference = new AtomicReference<>(100); static AtomicStampedReference<Integer>原创 2020-08-08 22:14:47 · 159 阅读 · 0 评论 -
Java并发CAS原理
CAS(CompareAndSet)实现原理Unsafe类的支持自旋锁Unsafe类是什么?是CAS的核心类,Unsafe类是一个native方法,底层是C++语言实现的,Unsafe在Sun.misc包下,由此Java可以操作底层的内存,得以实现CAS的原子操作.原创 2020-08-08 21:09:32 · 128 阅读 · 0 评论 -
Java并发CAS基本功能
CAS简介CAS全程CompareAndSet,比较并交换,有一个期望值,和一个最终修改值,如果期望值不相等则修改失败,否则修改成功.CAS案例public class CompareAndSetDemo { static AtomicInteger atomicInteger = new AtomicInteger(6); public static void main(String[] args) { boolean b = atomicInteger.compa原创 2020-08-08 19:22:22 · 227 阅读 · 0 评论 -
Java内存模型之原子性
原子性原子性,不可分割,操作不能打断.比如人说一句话不被打断这就是原子性.程序也是执行某个操作被打断就会产生致命的错误.原子性反面案例class Data{ volatile int number=0; public void numberIncrement(){ this.number++; }}public class Main { public static void main(String[] args) { Data da原创 2020-08-08 12:33:47 · 228 阅读 · 0 评论 -
Java内存模型可见性之volatile(三)
上一篇文章说到了JMM可见性的案例 链接: Java内存模型之可见性(二).volatilevolatile关键字是可以保证线程间的可见性,线程间通信,可以认为是轻量级的synchronized.案例class Data{ volatile int number=0; public void addTo60(){ this.number = 60; }}public class Main { public static void main(Str原创 2020-08-08 11:48:07 · 105 阅读 · 0 评论 -
Java内存模型之可见性(二)
Java线程通信Java中线程和线程之间是没法通信的,也就是不可见性。class Data{ int number=0; public void addTo60(){ this.number = 60; }}public class Main { public static void main(String[] args) { Data data = new Data(); new Thread(()->{原创 2020-08-08 11:14:51 · 121 阅读 · 0 评论